web-dev-qa-db-fra.com

Possibilité d'ajouter un autre paramètre au paramètre Affichage de la page de garde pour le type de message personnalisé

Permettez-moi de mettre en scène:

J'ai un CPT qui fonctionnera sur une installation multi-site et certains sites seront dans une langue différente. Par exemple, mon CPT est Case Studies. J'utiliserais une structure d'URL telle que: /case-studies/%post_id%/%postname%/, mais si la langue du site est différente, case-studies ne l'est plus.

Dans les paramètres WP, vous pouvez définir une page comme page de messages. Cela définit essentiellement la front sur votre structure de permalien. Ce que je veux faire, c'est ajouter un menu déroulant supplémentaire pour mon CPT qui permette de définir la page de garde pour les publications de ce CPT. Ainsi, si la langue est différente, la structure de lien permanent peut correspondre à cette langue.

Add setting here

Est-il donc possible d'étendre les paramètres à l'aide de l'API de paramètres à l'emplacement indiqué dans l'image ci-dessus? Si oui, comment ferais-je cela? Si non, où serait un endroit approprié pour placer mon paramètre CPT? (Points bonus si vous pouvez fournir des exemples de code)

1
Brady

J'ai choisi l'approche suivante:

J'avais déjà une page d'options de thème utilisant l'API de paramètres et, comme cette configuration CPT que j'ai configurée fait partie du thème, il était logique d'ajouter cette option aux options de thème. Ci-dessous le code si quelqu'un veut utiliser:

<?php
// Add settings to menu
add_action( 'admin_menu', 'sc_hi_rezz_theme_options_add_page' );
function sc_hi_rezz_theme_options_add_page() {
    add_theme_page(
        __( 'Theme Options', 'hi-rezz' ),
        __( 'Theme Options', 'hi-rezz' ),
        hi_rezz_get_options_page_cap(),
        'theme_options',
        'sc_hi_rezz_theme_options_do_page'
    );
}


// see https://make.wordpress.org/themes/2011/07/01/wordpress-3-2-fixing-the-edit_theme_optionsmanage_options-bug/
function hi_rezz_get_options_page_cap() {
    return 'edit_theme_options';
}
add_filter( 'option_page_capability_hi-rezz-options', 'hi_rezz_get_options_page_cap' );


// Fix Cap to allow editors to edit theme options
function sc_hi_rezz_get_options_page_cap() {
    return 'edit_theme_options';
}
add_filter( 'option_page_capability_hi-rezz-options', 'sc_hi_rezz_get_options_page_cap' );


// Options Page Layout
function sc_hi_rezz_theme_options_do_page() {
    ?>
    <div class="wrap">
        <?php screen_icon(); ?>
        <h2><?php _e( 'Theme Options', 'hi-rezz' ) ?></h2>
        <form action="options.php" method="post">
            <?php
            settings_fields( "hi_rezz_theme_options" );
            do_settings_sections( "theme_options" );
            ?>
            <?php submit_button( __( "Save changes", "hi-rezz" ), "primary", "submit", true ); ?>
        </form>
    </div>
    <?php
}


// Register Settings
add_action( 'admin_init', 'sc_hi_rezz_theme_settings_register' );
function sc_hi_rezz_theme_settings_register() {
    register_setting("hi_rezz_theme_options", "hi_rezz_theme_options", "sc_hi_rezz_theme_settings_validate"); // Register Main Settings
    add_settings_section("sc_hi-rezz_text", __("Text / Copy", "hi-rezz"), "hi_rezz_theme_settings_dummy", "theme_options"); // Make settings text section
    add_settings_section("sc_hi-rezz_cpt_settings", __("Custom Post Type Settings", "hi-rezz"), "hi_rezz_theme_settings_dummy", "theme_options"); // Make settings text section
    add_settings_field("hi_rezz_theme_settings_footer_copy", __("Footer copy", "hi-rezz"), "hi_rezz_theme_settings_footer_copy_field", "theme_options", "sc_hi-rezz_text");
    add_settings_field("hi_rezz_theme_settings_cpt_cs_page", __("Page for case studies", "hi-rezz"), "hi_rezz_theme_settings_cpt_cs_field", "theme_options", "sc_hi-rezz_cpt_settings");
}
function hi_rezz_theme_settings_dummy() { }


// Validate Settings
function sc_hi_rezz_theme_settings_validate($input) {
    $valid = get_option("hi_rezz_theme_options");
    $valid['sc_footer_copy'] = wp_filter_post_kses( $input['sc_footer_copy'] );
    $valid['sc_cpt_cas_study_page'] = (int) $input['sc_cpt_cas_study_page'];
    return $valid;
}


//Settings Fields
function hi_rezz_theme_settings_footer_copy_field() {
    $options = get_option("hi_rezz_theme_options");
    ?><textarea rows="4" cols="50" name="hi_rezz_theme_options[sc_footer_copy]" id="hi_rezz_theme_settings_footer_copy"><?php echo esc_textarea($options['sc_footer_copy']); ?></textarea><?php
}
function hi_rezz_theme_settings_cpt_cs_field() {
    $options = get_option("hi_rezz_theme_options");
    wp_dropdown_pages(
        array(
             'name' => 'hi_rezz_theme_options[sc_cpt_cas_study_page]',
             'echo' => 1,
             'show_option_none' => __( '&mdash; Select &mdash;' ),
             'option_none_value' => '0',
             'selected' => $options['sc_cpt_cas_study_page']
        )
    );
}
?>

Ce qui précède me donne:

My CPT settings

0
Brady

Il semble que le fichier options-reading.php code ses options en dur, plutôt que d'utiliser l'API Settings.

Et cette option utilise spécifiquement wp_dropdown_pages() . Le Codex énumère les arguments suivants pour wp_dropdown_pages():

<?php 
$args = array(
    'depth'            => 0,
    'child_of'         => 0,
    'selected'         => 0,
    'echo'             => 1,
    'name'             => 'page_id'); 
?>

La page Codex indique également que cette fonction peut théoriquement accepter n'importe quel argument pouvant être passé à get_pages() , qui inclut un argument post_type:

<?php 
$args = array(
    'child_of'     => 0,
    'sort_order'   => 'ASC',
    'sort_column'  => 'post_title',
    'hierarchical' => 1,
    'exclude'      => ,
    'include'      => ,
    'meta_key'     => ,
    'meta_value'   => ,
    'authors'      => ,
    'exclude_tree' => ,
    'post_type' => 'page',
?>

... ce qui signifie que théoriquement wp_dropdown_menu() pourrait être modifié pour renvoyer vos messages de type message personnalisé.

Notez que wp_dropdown_pages() a un crochet de filtre de sortie, wp_dropdown_pages :

$output = apply_filters('wp_dropdown_pages', $output);

... alors vous pourriez peut-être utiliser le filtre pour cibler le champ de formulaire page_on_front select en particulier:

wp_dropdown_pages( array( 'name' => 'page_on_front', 'echo' => 0, 'show_option_none' => __( '&mdash; Select &mdash;' ), 'option_none_value' => '0', 'selected' => get_option( 'page_on_front' ) ) ) );

MODIFIER

De ce commentaire:

Ce que je veux faire est de définir une page en tant que page de messages pour mon CPT, comme vous pouvez le faire pour les messages

Je ne suis toujours pas sûr que les paramètres de base soient vraiment extensibles de cette manière, mais vous avez des alternatives.

La plus évidente serait de créer un modèle de page personnalisé qui est une "page de messages" , dans lequel vous interrogez votre message personnalisé spécifique. Tapez .

Surtout des copies de pâtes du lien Codex; vous voudrez modifier le balisage pour l'adapter à votre thème:

<?php
/**
 * Template Name: Case Studies
 */
?>

<?php get_header(); ?>

<div id="content">

<?php 
$type = 'case-studies'; // Use the correct CPT slug here
$args=array(
  'post_type' => $type,
  'post_status' => 'publish',
  'paged' => $paged,
  'caller_get_posts'=> 1 // do not show sticky posts
);
// This bit is a "hack" to allow pagination to work properly
$temp = $wp_query;    
$wp_query = null;
$wp_query = new WP_Query($args); 
?>

<?php

 get_template_part( 'loop', 'index' );
 // Restore the original $wp_query
 $wp_query = $temp
?>

</div><!-- #content -->

<?php get_sidebar(); ?>
<?php get_footer(); ?>

Ensuite, bien sûr, créez simplement une page et attribuez-lui le modèle "Études de cas".

1
Chip Bennett