Question

( Note Modérateurs: Titre était à l'origine "Comment puis-je ajouter le "Attributs de page" et / ou "Attributs de page> Modèle" Sélecteur à l'éditeur de messages")

WP permet actuellement que l'attribution d'un « modèle » aux pages (à savoir post_type=='page'.) Je voudrais étendre cette fonctionnalité à des postes aussi bien (à savoir post_type=='post'.)

Comment puis-je ajouter le « Attributs de page » boîte méta et plus précisément, le sélecteur de modèle à l'éditeur de messages?

Je suppose que ce code est je place dans mon functions.php pour mon thème.

Mise à jour: J'ai réussi à ajouter les modèles à menu déroulant codées en dur mon éditeur poste, en ajoutant simplement la boîte de sélection html à mes options de méta personnalisées existantes boîte. Voici le code que je utilise pour cela ...

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

Et voici la fonction qui écrit les options et la boîte de sélection de modèle ...

//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
}

Et enfin, le code pour capturer les valeurs sélectionnées sur Enregistrer ...

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;
}

Maintenant, je crois tout ce qui reste est (1) capturant le modèle sélectionné et l'ajouter à la méta post pour ce poste et (2) la modification index.php et single.php afin qu'il utilise le modèle choisi.

Était-ce utile?

La solution

Je déteste être le porteur de mauvaises nouvelles, mais WordPress hardcodes la fonctionnalité modèle page à "page" de type poste , au moins dans v3.0 ( qui pourrait changer dans les versions futures, mais il n'y a pas une initiative spécifique, je suis au courant de changer encore. donc, c'est l'un des temps très peu j'ai du mal à comprendre comment se déplacer quelque chose sans le piratage de base.)

La solution que je suis venu avec est de copier essentiellement le code correspondant du noyau WordPress et le modifier à nos besoins. Voici les étapes (les numéros de ligne sont de v3.0.1):

  1. Copier la fonction page_attributes_meta_box() de la ligne 535 de /wp-admin/includes/meta-boxes.php et modifier en fonction.

  2. code un crochet add_meta_boxes pour ajouter le METABOX créé en # 1.

  3. Copier la fonction get_page_templates() à partir de la ligne 166 de /wp-admin/includes/theme.php et modifier en fonction.

  4. Copier la fonction page_template_dropdown() à la ligne 2550 de /wp-admin/includes/template.php et modifier en fonction.

  5. Ajouter un modèle post à votre thème.

  6. code un crochet save_post pour permettre le stockage du nom de fichier poste de modèle sur Enregistrer.

  7. code un crochet de single_template pour permettre le chargement du gabarit de poste pour les postes associés.

avec elle!


1. Copiez la fonction page_attributes_meta_box()

Comme notre première étape, vous devez copier la fonction page_attributes_meta_box() de la ligne 535 de /wp-admin/includes/meta-boxes.php et je l'ai choisi pour le renommer post_template_meta_box(). Puisque vous ne demande pour les modèles de page J'omis le code pour spécifier un parent post et pour spécifier l'ordre qui rend le code beaucoup plus simple. J'ai aussi choisi d'utiliser pour ce postmeta plutôt que d'essayer de réutiliser la propriété objet page_template afin d'éviter et d'éventuelles incompatibilités causées par un couplage involontaire. Alors, voici le code:

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. Code un crochet add_meta_boxes

L'étape suivante consiste à ajouter le METABOX à l'aide du crochet add_meta_boxes:

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. Copiez la fonction get_page_templates()

Je suppose que ce serait logique de faire la différence entre les modèles de page et le modèle après donc la nécessité d'une fonction get_post_templates() basée sur get_page_templates() de la ligne 166 de /wp-admin/includes/theme.php. Mais au lieu d'utiliser le marqueur de Template Name: qui utilisent des modèles de page cette fonction utilise un marqueur Post Template: au lieu que vous pouvez voir ci-dessous.

J'ai également filtré l'inspection des functions.php (ne sais pas comment get_page_templates() jamais fonctionné correctement sans cela, mais peu importe!) Et la seule chose qui reste est de changer les références au mot page à post pour une meilleure lisibilité de l'entretien sur la route:

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. Copiez la fonction page_template_dropdown()

De même copie page_template_dropdown() de la ligne 2550 de /wp-admin/includes/template.php pour créer post_template_dropdown() et changer simplement pour appeler à la place 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. Ajouter un modèle Poster

L'étape suivante consiste à ajouter un modèle après pour tester. En utilisant le marqueur Post Template: mentionné à l'étape 3 copie single.php de votre thème single-test.php et ajoutez l'en-tête de commentaire suivant ( assurez-vous de modifier quelque chose dans single-test.php afin que vous puissiez le dire chargement au lieu de single.php) :

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

Une fois que vous avez fait à travers les étapes 1 # 5, vous pouvez voir votre "Modèles Post" METABOX apparaissent sur votre page post éditeur:


(Source : mikeschinkel.com )

6. Code un crochet save_post

Maintenant que vous avez l'éditeur carré vous devez loin pour réellement sauver votre page nom de fichier de modèle à postmeta lorsque l'utilisateur clique « Publier ». Voici le code pour que:

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. Code un crochet single_template

Enfin, vous devez réellement obtenir WordPress pour utiliser vos nouveaux modèles de poste. Vous faites cela en accrochant single_template et en retournant votre nom de modèle de votre choix pour les postes qui ont eu un attribué:

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;
}

Et c'est tout!

NOTE I n'a pas prendre en considération Types personnalisés post , ne post_type=='post'. À mon avis face à des types personnalisés poste nécessiteraient une distinction entre les différents types de postes et, sans trop difficile, je n'ai pas essayé ici.

Autres conseils

Wordpress vous permet d'ajouter Meta à l'aide d'un plug-in Catégories:

Pour ce faire, vous devez ajouter l'une des diverses extensions qui ajoute méta aux catégories (mimer les pages sortir de la boîte), Meta simple terme fait le travail bien.

N.B.. 3.x WordPress est nécessaire pour étendre les catégories.

Après cela, vous pouvez utiliser:

  • add_term_meta
  • update_term_meta
  • get_term_meta

Utilisez functions.php pour ajouter des méthodes pour faire ce que vous voulez par exemple.

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']);                  
}

L'appel de nouveaux champs dans les thèmes est facile:

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

Plus de détails et exemples: http://www.wphub.com/adding-metadata-taxonomy-terms/

Licencié sous: CC-BY-SA avec attribution
Non affilié à wordpress.stackexchange
scroll top