web-dev-qa-db-fra.com

Ajout d'attributs de page Metabox et de modèles de page à la page d'édition?

( Note du modérateur: Title était à l'origine "Comment ajouter les" Attributs de page "et/ou le sélecteur" Attributs de page> Modèle "à l'éditeur POSTS")

À l’heure actuelle, WP autorise uniquement l’affectation d’un "modèle" à Pages (c.-à-d. post_type=='page'.). J'aimerais également étendre cette fonctionnalité aux messages (c.-à-d. post_type=='post'.).

Comment puis-je ajouter la "Attributs de page" meta box et plus précisément le sélecteur de modèle à l'éditeur de messages?

Je suppose que c'est le code que je placerai dans mon functions.php pour mon thème.

MISE À JOUR: J'ai réussi à ajouter le menu déroulant des modèles codés en dur à mon éditeur de publication, en ajoutant simplement le champ html de la zone de sélection à ma zone d'options de méta personnalisées existante. Voici le code que j'utilise pour ça ...

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 du 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 save ...

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 que tout ce qui reste à faire est (1) de capturer le modèle sélectionné et de l’ajouter à la méta-poste de ce message et (2) de modifier index.php et single.php afin qu’il utilise le modèle choisi.

13
Scott B

Déteste être le porteur de mauvaises nouvelles mais WordPress code la fonctionnalité de modèle de page sur le "page" type de poste , au moins dans la v3.0 (qui pourrait changer à l'avenir Je ne suis au courant d'aucune initiative spécifique pour le changer. C'est donc l'une des rares fois où j'ai du mal à trouver le moyen de contourner un problème sans en pirater le cœur.)} _

La solution que j'ai proposée consiste à copier le code correspondant à partir de WordPress et à le modifier selon nos besoins. Voici les étapes (les numéros de ligne proviennent de la v3.0.1):

  1. Copiez la fonction page_attributes_meta_box()de la ligne 535 de /wp-admin/includes/meta-boxes.php et modifiez-la en conséquence.

  2. Code un hook add_meta_boxespour ajouter le metabox créé dans # 1.

  3. Copiez la fonction get_page_templates()à partir de la ligne 166 de /wp-admin/includes/theme.php et modifiez-la en conséquence.

  4. Copiez la fonction page_template_dropdown()de la ligne 2550 de /wp-admin/includes/template.php et modifiez-la en conséquence.

  5. Ajouter un modèle de publication à votre thème.

  6. Code un crochet save_postpour permettre le stockage du nom du fichier de modèle de poste lors de la sauvegarde.

  7. Code un crochet single_templatepour permettre le chargement du modèle de publication pour les publications associées.

Maintenant avec ça!


1. Copiez la fonction page_attributes_meta_box()

Dans un premier temps, vous devez copier la fonction page_attributes_meta_box() à partir de la ligne 535 de /wp-admin/includes/meta-boxes.php et j'ai choisi de la renommer post_template_meta_box(). Comme vous n’avez demandé que des modèles de page, j’ai omis le code pour spécifier une publication parente et pour spécifier l’ordre, ce qui simplifie beaucoup le code. J'ai également choisi d'utiliser postmeta pour cela plutôt que d'essayer de réutiliser la propriété d'objet page_template afin d'éviter les incompatibilités potentielles causées par un couplage non intentionnel. 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. Codez un crochet add_meta_boxes

La prochaine étape consiste à ajouter le metabox à l’aide du hook 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()

J'ai supposé qu'il serait logique de faire la différence entre les modèles de page et les modèles de publication, d'où la nécessité d'une fonction get_post_templates() basée sur get_page_templates() à partir de la ligne 166 du /wp-admin/includes/theme.php. Mais au lieu d'utiliser le marqueur Template Name: quels modèles de page utilisent cette fonction, vous utilisez un marqueur Post Template: que vous pouvez voir ci-dessous.

J'ai également filtré l'inspection de functions.php(je ne sais pas comment get_page_templates() a déjà fonctionné correctement sans cela, mais peu importe!)} Et il ne reste plus qu'à changer les références à Word page en post pour faciliter la lisibilité de la maintenance:

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, copiez page_template_dropdown() à partir de la ligne 2550 de /wp-admin/includes/template.php pour créer post_template_dropdown() et changez-le simplement pour appeler get_post_templates() à la place:

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 de publication

La prochaine étape consiste à ajouter un modèle de publication à des fins de test. À l'aide du marqueur Post Template: mentionné à l'étape 3, copiez single.php de votre thème dans single-test.php et ajoutez l'en-tête de commentaire suivant (assurez-vous de modifier quelque chose dans single-test.php afin de pouvoir indiquer qu'il se charge au lieu de single.php)}:

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

Une fois que vous avez terminé les étapes 1 à 5, vous pouvez voir votre "Modèles de publication"} _ metabox apparaître sur la page de votre éditeur de publication:

 What a Post Templates Metabox looked like when added to WordPress 3.0 
(source: mikeschinkel.com )

6. Coder un crochet save_post

Maintenant que l'éditeur est au rendez-vous, vous devez enregistrer le nom de fichier de votre modèle de page dans postmeta lorsque l'utilisateur clique sur "Publier". Voici le code pour cela:

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

Enfin, vous devez faire en sorte que WordPress utilise vos nouveaux modèles de publication. Pour ce faire, vous raccordez single_template et renvoyez le nom de modèle souhaité pour les publications auxquelles un article a été 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 à peu près tout!

NOTEque jepasprend en considération Types de publication personnalisés , uniquement post_type=='post'. À mon avis, aborder les types de publication personnalisés nécessiterait de différencier les différents types de publication et, sans être trop difficile, je ne l'ai pas essayé ici.

11
MikeSchinkel

Wordpress vous permet d'ajouter des méta aux catégories à l'aide d'un plugin:

Pour ce faire, vous devez ajouter l'une des diverses extensions qui ajoute des méta aux catégories (en reprenant les pages qui sortent de la boîte), Simple Term Meta fait le travail correctement.

N.B. WordPress 3.x 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 simple:

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

0
Jay