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

11

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

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

Comment puis-je ajouter la méta-boîte "Attributs de page" 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.

UPDATE: 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 boîte 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 permettant de capturer les valeurs sélectionnées lors de la sauvegarde ...

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

    
posée Scott B 10.10.2010 - 19:40

2 réponses

11

Déteste être porteur de mauvaises nouvelles, mais WordPress code la fonctionnalité de modèle de page sur le type de publication "page" , au moins dans la v3.0 ( cela pourrait changer dans les versions futures, mais je ne suis pas au courant d'une initiative spécifique pour le changer. C'est donc l'une des rares fois où j'ai du mal à trouver le moyen de contourner quelque chose sans avoir à pirater le coeur.)

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 à votre guise.

  2. Codez un add_meta_boxes hook pour ajouter le métabox créé dans # 1.

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

  4. Copiez la fonction page_template_dropdown() de la ligne 2550 de /wp-admin/includes/template.php et modifiez-la à votre guise.

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

  6. Codez un save_post hook pour permettre le stockage du nom de fichier du modèle de post-script lors de l'enregistrement.

  7. Codez un single_template hook pour permettre le chargement du modèle de publication pour les publications associées.

Maintenant avec!

1. Copiez la fonction page_attributes_meta_box()

Dans un premier temps, vous devez copier la fonction page_attributes_meta_box() de la ligne 535 de /wp-admin/includes/meta-boxes.php et j'ai choisi de le 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. Coder un add_meta_boxes hook

L'étape suivante consiste à ajouter la métabox à l'aide de 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. 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 de /wp-admin/includes/theme.php . Mais au lieu d'utiliser le marqueur Template Name: , les modèles de page utilisant cette fonction utilisent un marqueur Post Template: que vous pouvez voir ci-dessous.

J'ai aussi filtré l'inspection de functions.php (je ne sais pas comment get_page_templates() a jamais fonctionné correctement sans cela, mais peu importe!) Et la seule chose qui reste à faire est de changer les références au mot page à post pour 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 modifiez-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. En utilisant le 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 de façon à ce que le chargement se fasse au lieu de). single.php ) :

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

Une fois que vous avez terminé les étapes 1 à 5, votre métaboxe "Modèles de publication" apparaît sur la page de l'éditeur de publication:

6.Codeasave_posthook

Maintenantquel'éditeurestaurendez-vous,vousdevezenregistrerlenomdefichierdevotremodèledepagedanspostmetalorsquel'utilisateurcliquesur"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. Code a single_template hook

Enfin, vous devez obliger WordPress à utiliser vos nouveaux modèles de publication. Vous le faites en accrochant single_template et en renvoyant le nom de modèle souhaité pour les publications auxquelles un article a été affecté:

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!

REMARQUE que je n'ai pas tenu compte des types de publication personnalisés , uniquement de post_type=='post' . À mon avis, pour traiter les types de publication personnalisés, il serait nécessaire de faire la distinction entre les différents types de publication et, bien que ce ne soit pas trop difficile, je ne l'ai pas essayé ici.

    
réponse donnée MikeSchinkel 11.10.2010 - 01:11
0

Wordpress vous permet d’ajouter Meta à des catégories à l’aide d’un plugin:

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

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

Il est facile d'appeler de nouveaux champs dans les thèmes:

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

Plus de détails et exemples: enlace

    
réponse donnée Jay 14.09.2013 - 16:27

Lire d'autres questions sur les étiquettes