web-dev-qa-db-fra.com

réécrire le slug de type de message personnalisé dans l'admin

Je développe un site qui aura éventuellement une copie, une WP séparée, installée dans une autre langue. J'ai quelques types de publication personnalisés sur ce site, dont certains avec des slugs personnalisés pour les pages d'archive et/ou pour les publications singulières. Je me demandais si je pouvais utiliser les options d'une page d'administration personnalisée pour le faire? Cette approche présente-t-elle des pièges?

Je définirais donc une option personnalisée à utiliser dans WP Admin:

    class MySettingsPage
{

    private $options;


    public function __construct()
    {
        add_action( 'admin_menu', array( $this, 'add_plugin_page' ) );
        add_action( 'admin_init', array( $this, 'page_init' ) );
    }


    public function add_plugin_page()
    {
        // This page will be under "Settings"
        add_options_page(
            'Settings Admin',
            'Custom Settings',
            'manage_options',
            'my-setting-admin',
            array( $this, 'create_admin_page' )
        );
    }


    public function create_admin_page()
    {
        // Set class property
        $this->options = get_option( 'my_option_name' );
        ?>
        <div class="wrap">
            <h1>Custom Settings</h1>
            <form method="post" action="options.php">
            <?php
                // This prints out all hidden setting fields
                settings_fields( 'my_option_group' );
                do_settings_sections( 'my-setting-admin' );
                submit_button();
            ?>
            </form>
        </div>
        <?php
    }


    public function page_init()
    {
        register_setting(
            'my_option_group', // Option group
            'my_option_name', // Option name
            array( $this, 'sanitize' ) // Sanitize
        );

        add_settings_section(
            'setting_section_id', // ID
            'My Custom Settings', // Title
            array( $this, 'print_section_info' ), // Callback
            'my-setting-admin' // Page
        );

        add_settings_field(
            'custom_slug', // slug
            'Custom Slug', // Title
            array( $this, 'custom_slug_callback' ), // Callback
            'my-setting-admin', // Page
            'setting_section_id' // Section
        );


    }


    public function sanitize( $input )
    {
        $new_input = array();
        if( isset( $input['custom_slug'] ) )
            $new_input['custom_slug'] = sanitize_text_field( $input['custom_slug'] );

        return $new_input;
    }


    public function print_section_info()
    {
        print 'Enter your settings below:';
    }


    public function custom_slug_callback()
    {
        printf(
            '<input type="text" id="custom_slug" name="my_option_name[custom_slug]" value="%s" />',
            isset( $this->options['custom_slug'] ) ? esc_attr( $this->options['custom_slug']) : ''
        );
    }   
}

    if( is_admin() ) {
        $my_settings_page = new MySettingsPage();
    }

Essayez ensuite d’utiliser la valeur de l’option comme slug pour enregistrer les types de publication:

$o = get_option('my_option_name');
$s = $o['custom_slug'];

register_post_type( 'ugly_machine_name',
        array(
            'labels' => array(
                'name' => __( 'Pretty Name', 'my-child-theme' ),
                'singular_name' => __( 'Pretty Name', 'my-child-theme' )
            ),
            'public' => true,
            'has_archive' => $s,
            'rewrite' => array( 'slug' => $s, 'with_front' => false ),
            'supports' => array( 'title', 'editor', 'custom-fields' )
        )
    );

Je suis conscient qu'après chaque modification de ces options, l'option permaliens devrait être chargée pour que les paramètres prennent effet, mais elle ne serait modifiée qu'une fois lors de la copie du site.

J'ai également essayé cela auparavant à des fins similaires sur une autre page et cela n'a pas fonctionné:

register_post_type( 'ugly_machine_name',
        array(
            'labels' => array(
                'name' => __( 'Pretty Name', 'my-child-theme' ), // these got 
                'singular_name' => __( 'Pretty Name', 'my-child-theme' ) // loaded
            ),
            'public' => true,
            'has_archive' => __( 'pretty-name', 'my-child-theme' ), // theese didn't load (the translations)
            'rewrite' => array( 'slug' => __( 'pretty-name', 'my-child-theme' ), 'with_front' => false ),
            'supports' => array( 'title', 'editor', 'custom-fields' )
        )
    );
1
D. Dan

Alors ce que j'ai fait était:

Commencez par créer une fonction qui renverrait ces slugs sur la base du nom de type de publication personnalisé. Si le slug personnalisé fourni ne répondait pas aux exigences, il retombe à une valeur par défaut:

function my_get_custom_slugs($cpt){
    $all_the_slugs = [
        "ugly_machine_name_1" => "default-pretty-name-1",
        "ugly_machine_name_2" => "default-pretty-name-2",
        //...etc
    ];
    $r_val = array();
    $options = get_option('my_option_name');
    foreach ($all_the_slugs as $key => $val) {
        if (strlen(trim($options[$key . "_slug"])) > 2){
            $r_val[$key] = $options[$key . "_slug"];
        } else {
            $r_val[$key] = $val;
        }
    }
    return $r_val[$cpt];
}

Bien sûr, je dois maintenant renommer les identifiants des champs d'options personnalisées pour qu'ils correspondent au nom de type-post-personnalisé + "_slug".

Et maintenant, je peux l’utiliser dans mes déclarations de type de post de registre:

register_post_type( 'this_cpt',
        array(
            'labels' => array(
                'name' => __( 'This CPT Name', 'my-child-theme' ),
                'singular_name' => __( 'This CPT Name', 'my-child-theme' )
            ),
            'public' => true,
            'has_archive' => my_get_custom_slugs('this_cpt'),
            'rewrite' => array( 'slug' => my_get_custom_slugs('this_cpt'), 'with_front' => false ),
            'supports' => array( 'title', 'editor', 'custom-fields' )
        )
    );

Et aussi n'importe où dans mes fichiers modèles, si besoin est.

2
D. Dan