web-dev-qa-db-ja.com

wp adminでカスタム投稿タイプのスラッグを書き換える

私は最終的にコピーを持つサイトを開発しています。別の言語でWPをインストールします。このサイトにはカスタム投稿タイプがいくつかありますが、そのうちのいくつかにはアーカイブページおよび/または単一投稿用のカスタムスラッグがあります。カスタム管理ページのオプションを使ってこれを行うことができるだろうか。このアプローチには落とし穴がありますか?

そのため、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();
    }

それから投稿タイプを登録するためのスラッグとしてオプションの値を使ってみてください。

$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' )
        )
    );

これらのオプションを変更するたびに、設定を有効にするためにpermalinksオプションをロードする必要がありますが、サイトがコピーされたときに1回しか変更されません。

私はまた別のページで同様の目的のために以前にこれを試しました、そしてそれはうまくいきませんでした:

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

だから私は何をしました:

最初に、カスタム投稿タイプ名に基づいてこれらのスラッグを返すような関数を作成します。提供されたカスタムスラッグが要件を満たさない場合は、デフォルト値にフォールバックします。

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];
}

もちろん、custom-post-type-name + "_slug"と一致するように、カスタムオプションフィールドのIDの名前を変更する必要があります。

そして今、私は私のレジスターポストタイプ宣言でそれを使用することができます:

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' )
        )
    );

必要な場合は、テンプレートファイル内の任意の場所にも。

2
D. Dan