web-dev-qa-db-fra.com

Ajouter des champs personnalisés lorsque des modèles spécifiques sont sélectionnés

J'essaie d'apporter des modifications à un site où l'infrastructure actuelle n'est pas satisfaisante, en raison de la façon dont elle a été construite par rapport au site précédent, plutôt que récente.

J'ai une section du site qui a besoin de ses propres champs personnalisés. Cette section ne garantit pas son propre type de publication, et en raison de l'état du site, il est extrêmement difficile de le faire de cette façon. Ce que je ne veux pas pour le bénéfice de l'utilisateur, c'est de leur faire utiliser les champs personnalisés, car c'est assez bâclé.

Alors, comment puis-je ajouter des champs (comme vous le feriez pour un type d'article personnalisé) lorsqu'un certain modèle est sélectionné?

4
Leonard

Peux-tu faire ça? Absolument! Vous devez simplement interroger la valeur de clé méta _wp_page_template de l'objet $post et agir en conséquence. Peut-être quelque chose comme ça:

// Globalize $post
global $post;
// Get the page template post meta
$page_template = get_post_meta( $post->ID, '_wp_page_template', true );
// If the current page uses our specific
// template, then output our post meta
if ( 'template-foobar.php' == $page_template ) {
    // Put your specific custom post meta stuff here
}

Maintenant, je recommanderais d’utiliser un custom post meta box , plutôt que des champs personnalisés.

Bien que l'implémentation complète des boîtes à méta postales personnalisées dépasse légèrement le cadre de votre question, la réponse sous-jacente reste la même. Je vais essayer de vous indiquer la direction générale, cependant. Vous utiliserez une combinaison de add_meta_box() , appelée dans un callback raccordé à add_meta_boxes-{hook}, un callback pour définir la métabox et un callback pour valider/désinfecter et enregistrer une méta-publication personnalisée.

function wpse70958_add_meta_boxes( $post ) {

    // Get the page template post meta
    $page_template = get_post_meta( $post->ID, '_wp_page_template', true );
    // If the current page uses our specific
    // template, then output our custom metabox
    if ( 'template-foobar.php' == $page_template ) {
        add_meta_box(
            'wpse70958-custom-metabox', // Metabox HTML ID attribute
            'Special Post Meta', // Metabox title
            'wpse70598_page_template_metabox', // callback name
            'page', // post type
            'side', // context (advanced, normal, or side)
            'default', // priority (high, core, default or low)
        );
    }
}
// Make sure to use "_" instead of "-"
add_action( 'add_meta_boxes_page', 'wpse70958_add_meta_boxes' );


function wpse70598_page_template_metabox() {
    // Define the meta box form fields here
}


function wpse70958_save_custom_post_meta() {
    // Sanitize/validate post meta here, before calling update_post_meta()
}
add_action( 'publish_page', 'wpse70958_save_custom_post_meta' );
add_action( 'draft_page', 'wpse70958_save_custom_post_meta' );
add_action( 'future_page', 'wpse70958_save_custom_post_meta' );

Modifier

Il peut être préférable d’envelopper l’appel complet add_meta_box() dans le conditionnel.

13
Chip Bennett