Adicionando Metabox e Templates de Páginas de Atributos de Página à Página de Edição de Posts?

11

( Nota dos moderadores: O título era originalmente "Como posso adicionar o seletor" Atributos da página "e / ou" Atributos da página & modelo gt; "ao editor POSTS")

No momento, o WP permite apenas a atribuição de um "modelo" às Páginas (por exemplo, post_type=='page' .) Gostaria de estender essa funcionalidade também às Postagens (por exemplo, post_type=='post' .)

Como posso adicionar a caixa meta "Atributos da página" e, mais especificamente, o alternador de modelos ao editor de publicações?

Estou assumindo que este é o código que colocarei no meu functions.php para o meu tema.

ATUALIZAÇÃO: Consegui adicionar o menu suspenso de modelos codificados ao meu editor de postagem, simplesmente adicionando a caixa de seleção html à minha caixa de opções meta personalizada existente. Aqui está o código que estou usando para isso ...

add_meta_box('categorydiv2', __('Post Options'), 'post_categories_meta_box_modified', 'post', 'side', 'high');

E aqui está a função que escreve as opções e a caixa de seleção do modelo ...

//adds the custom categories box
function post_categories_meta_box_modified() {
    global $post;
    if( get_post_meta($post->ID, '_noindex', true) ) $noindexChecked = " checked='checked'";
    if( get_post_meta($post->ID, '_nofollow', true) ) $nofollowChecked = " checked='checked'";
?>
<div id="categories-all" class="ui-tabs-panel">
    <ul id="categorychecklist" class="list:category categorychecklist form-no-clear">
        <li id='noIndex' class="popular-category"><label class="selectit"><input value="noIndex" type="checkbox" name="chk_noIndex" id="chk_noIndex"<?php echo $noindexChecked ?> /> noindex</label></li> 
        <li id='noFollow' class="popular-category"><label class="selectit"><input value="noFollow" type="checkbox" name="chk_noFollow" id="chk_noFollow"<?php echo $nofollowChecked ?> /> nofollow</label></li>
    </ul>

    <p><strong>Template</strong></p> 
    <label class="screen-reader-text" for="page_template">Post Template</label><select name="page_template" id="page_template"> 
    <option value='default'>Default Template</option> 
    <option value='template-wide.php' >No Sidebar</option>
    <option value='template-salespage.php' >Salespage</option>
    </select>
</div>
<?php
}

E, finalmente, o código para capturar os valores selecionados em salvar ...

function save_post_categories_meta($post_id) {
    if ( defined('DOING_AUTOSAVE') && DOING_AUTOSAVE ) return $post_id;
    $noIndex = $_POST['chk_noIndex'];
    $noFollow = $_POST['chk_noFollow'];
    update_post_meta( $post_id, '_noindex', $noIndex );
    update_post_meta( $post_id, '_nofollow', $noFollow );
    return $post_id;
}

Agora, acredito que tudo o que resta é (1) capturar o template selecionado e adicioná-lo ao post meta para este post e (2) modificar index.php e single.php para que ele use o template escolhido.

    
por Scott B 10.10.2010 / 19:40

2 respostas

11

Odeio ser o portador de más notícias, mas o WordPress codifica a funcionalidade do Modelo de Página para o tipo de postagem "página" , pelo menos na v3.0 ( Isso pode mudar em versões futuras, mas não há uma iniciativa específica que eu saiba para alterá-la ainda.Então, esta é uma das poucas vezes que estou lutando para descobrir como contornar algo sem invadir o núcleo.)

A solução que obtive é basicamente copiar o código relevante do núcleo do WordPress e modificá-lo para as nossas necessidades. Aqui estão os passos (os números de linha são da v3.0.1):

  1. Copie a page_attributes_meta_box() function da linha 535 de /wp-admin/includes/meta-boxes.php e modifique para adequá-la.

  2. Codifique um add_meta_boxes hook para adicionar o metabox criado em # 1.

  3. Copie a get_page_templates() function da linha 166 de /wp-admin/includes/theme.php e modificar para se adequar.

  4. Copie a page_template_dropdown() function da linha 2550 de /wp-admin/includes/template.php e modifique para adequá-la.

  5. Adicione um modelo de postagem ao seu tema.

  6. Codifique um save_post hook para ativar o armazenamento do nome do arquivo de modelo de postagem ao salvar.

  7. Codifique um single_template hook para ativar o carregamento do modelo de postagem para as postagens associadas.

Agora, com isso!

1. Copie a função page_attributes_meta_box()

Como primeiro passo, você precisa copiar a função page_attributes_meta_box() da linha 535 de /wp-admin/includes/meta-boxes.php e eu escolhi renomeá-la como post_template_meta_box() . Como você solicitou apenas modelos de página, omiti o código para especificar uma postagem pai e para especificar a ordem que torna o código muito mais simples. Eu também escolhi usar postmeta para isso em vez de tentar reutilizar a propriedade de objeto page_template para evitar possíveis incompatibilidades causadas pelo acoplamento não intencional. Então aqui está o código:

function post_template_meta_box($post) {
  if ( 'post' == $post->post_type && 0 != count( get_post_templates() ) ) {
    $template = get_post_meta($post->ID,'_post_template',true);
    ?>
<label class="screen-reader-text" for="post_template"><?php _e('Post Template') ?></label><select name="post_template" id="post_template">
<option value='default'><?php _e('Default Template'); ?></option>
<?php post_template_dropdown($template); ?>
</select>
<?php
  } ?>
<?php
}

2. Codifique um add_meta_boxes hook

O próximo passo é adicionar o metabox usando o add_meta_boxes hook:

add_action('add_meta_boxes','add_post_template_metabox');
function add_post_template_metabox() {
    add_meta_box('postparentdiv', __('Post Template'), 'post_template_meta_box', 'post', 'side', 'core');
}

3. Copie a função get_page_templates()

Presumi que faria sentido diferenciar entre modelos de página e modelo de postagem, assim, a necessidade de uma função get_post_templates() com base em get_page_templates() da linha 166 de /wp-admin/includes/theme.php . Mas, em vez de usar o marcador Template Name: , os modelos de página que usam essa função usam um marcador Post Template: , que você pode ver abaixo.

Eu também filtrou a inspeção de functions.php (não sei como get_page_templates() funcionou corretamente sem isso, mas seja qual for!) E a única coisa que resta é alterar as referências à palavra page para post para legibilidade de manutenção ao longo da estrada:

function get_post_templates() {
  $themes = get_themes();
  $theme = get_current_theme();
  $templates = $themes[$theme]['Template Files'];
  $post_templates = array();

  if ( is_array( $templates ) ) {
    $base = array( trailingslashit(get_template_directory()), trailingslashit(get_stylesheet_directory()) );

    foreach ( $templates as $template ) {
      $basename = str_replace($base, '', $template);
      if ($basename != 'functions.php') {
        // don't allow template files in subdirectories
        if ( false !== strpos($basename, '/') )
          continue;

        $template_data = implode( '', file( $template ));

        $name = '';
        if ( preg_match( '|Post Template:(.*)$|mi', $template_data, $name ) )
          $name = _cleanup_header_comment($name[1]);

        if ( !empty( $name ) ) {
          $post_templates[trim( $name )] = $basename;
        }
      }
    }
  }

  return $post_templates;
}

4. Copie a função page_template_dropdown()

Da mesma forma, copie page_template_dropdown() da linha 2550 de /wp-admin/includes/template.php para criar post_template_dropdown() e simplesmente altere para chamar get_post_templates() :

function post_template_dropdown( $default = '' ) {
  $templates = get_post_templates();
  ksort( $templates );
  foreach (array_keys( $templates ) as $template )
    : if ( $default == $templates[$template] )
      $selected = " selected='selected'";
    else
      $selected = '';
  echo "\n\t<option value='".$templates[$template]."' $selected>$template</option>";
  endforeach;
}

5. Adicionar um modelo de postagem

O próximo passo é adicionar um modelo de postagem para teste. Usando o marcador Post Template: mencionado na etapa nº 3, copie single.php do seu tema para single-test.php e adicione o seguinte cabeçalho de comentário ( certifique-se de modificar algo em single-test.php para saber que está carregando em vez de single.php ) :

/**
 * Post Template: My Test Template
 */

Depois de executar as etapas de 1 a 5, você poderá ver seu metabox "Modelos de postagem" aparecer na página do editor de postagens:

6.Codifiqueumsave_posthook

Agoraquevocêtemoeditoraomesmotempo,precisasalvaronomedoarquivodemodelodepáginaparapostmetaquandoousuárioclicarem"Publicar". Aqui está o código para isso:

add_action('save_post','save_post_template',10,2);
function save_post_template($post_id,$post) {
  if ($post->post_type=='post' && !empty($_POST['post_template']))
    update_post_meta($post->ID,'_post_template',$_POST['post_template']);
}

7. Codifique um single_template hook

E, finalmente, você precisa realmente fazer com que o WordPress use seus novos modelos de postagem. Você faz isso ligando single_template e retornando o nome do seu modelo desejado para as postagens que tiveram um atribuído:

add_filter('single_template','get_post_template_for_template_loader');
function get_post_template_for_template_loader($template) {
  global $wp_query;
  $post = $wp_query->get_queried_object();
  if ($post) {
    $post_template = get_post_meta($post->ID,'_post_template',true);
    if (!empty($post_template) && $post_template!='default')
      $template = get_stylesheet_directory() . "/{$post_template}";
  }
  return $template;
}

E é sobre isso!

OBSERVAÇÃO de que não leva em consideração Tipos de postagem personalizada , somente post_type=='post' . Na minha opinião, endereçar tipos de postagem personalizados exigiria a diferenciação entre os diferentes tipos de postagens e, embora não excessivamente difícil, não tentei fazer isso aqui.

    
por MikeSchinkel 11.10.2010 / 01:11
0

O Wordpress permite adicionar Meta a Categorias usando um plug-in:

Para fazer isso, você precisa adicionar uma das várias extensões que adicionam meta a categorias (imitando as páginas que saem da caixa), Simple Term Meta faz o trabalho bem.

N.B. O WordPress 3.x é necessário para estender as categorias.

Depois disso, você pode usar:

  • add_term_meta
  • update_term_meta
  • get_term_meta

Use Functions.php para adicionar métodos para fazer o que você deseja, por exemplo,

add_action('category_add_form_fields', 'category_metabox_add', 10, 1);

function category_metabox_add($tag) { ?>
    <div class="form-field">
        <label for="image-url"><?php _e('Image URL') ?></label>
        <input name="image-url" id="image-url" type="text" value="" size="40" aria-required="true" />
        <p class="description"><?php _e('This image will be the thumbnail shown on the category page.'); ?></p>
    </div>
<?php } 

add_action('created_category', 'save_category_metadata', 10, 1);

function save_category_metadata($term_id)
{
    if (isset($_POST['image-url'])) 
        update_term_meta( $term_id, 'image-url', $_POST['image-url']);                  
}

É fácil chamar novos campos em temas:

<?php echo get_term_meta(get_query_var('cat'), 'image-url', true); ?>

Mais detalhes e exemplos: enlace

    
por Jay 14.09.2013 / 16:27