web-dev-qa-db-ja.com

カスタム投稿タイプの閲覧設定に静的ページを追加する

カスタム投稿タイプを作成し、アーカイブページに静的ページをユーザーに選択させます。たとえば、投稿ページの下にあります。プロジェクトページを追加したいです。[Dropdown]

閲覧設定ページに別の静的ページオプションを追加する方法はありますか?変更するための既存のフックはありますか?

reading settings 

また、Pagesでこのように選択されたページをマークする方法はありますか?

enter image description here 

更新:

/wp/wp-admin/includes/template.php:1768を見る

/**
 * Filters the default post display states used in the posts list table.
 *
 * @since 2.8.0
 * @since 3.6.0 Added the `$post` parameter.
 *
 * @param array   $post_states An array of post display states.
 * @param WP_Post $post        The current post object.
 */
$post_states = apply_filters( 'display_post_states', $post_states, $post );

if ( ! empty($post_states) ) {
    $state_count = count($post_states);
    $i = 0;
    echo ' — ';
    foreach ( $post_states as $state ) {
        ++$i;
        ( $i == $state_count ) ? $sep = '' : $sep = ', ';
        echo "<span class='post-state'>$state$sep</span>";
    }
}

Post_stateにはフックがあるようですが、どのように設定しますか?

また、/wp-admin/options-reading.php:83を見てください。

実際にファイルを変更せずにReadingの設定を変更する方法はありますか?

4
YarGnawh

[投稿ページ]ドロップダウンフィールドの直下に新しいフィールドを追加することが可能かどうかはわかりませんが、少なくともこれを行う方法はありません。

しかし、あなたはただ読書設定ページに別のドロップダウンメニューを追加することができます。これはあなたの下になります。

これを行うには、まず新しい設定をregisterに設定し、add a new settings fieldをデフォルトのWordPressのreadingページに設定する必要があります。

/**
 * Register and define the settings
 */
add_action('admin_init', 'prfx_admin_init');
function prfx_admin_init(){

    // register our setting
    $args = array(
        'type' => 'string', 
        'sanitize_callback' => 'sanitize_text_field',
        'default' => NULL,
    );
    register_setting( 
        'reading', // option group "reading", default WP group
        'my_project_archive_page', // option name
        $args 
    );

    // add our new setting
    add_settings_field(
        'my_project_archive_page', // ID
        __('Project Archive Page', 'textdomain'), // Title
        'prfx_setting_callback_function', // Callback
        'reading', // page
        'default', // section
        array( 'label_for' => 'my_project_archive_page' )
    );
}

これで、カスタムフィールド用のコールバック関数を作成できます。これは、HTMLマークアップを保持します。

/**
 * Custom field callback
 */
function prfx_setting_callback_function($args){
    // get saved project page ID
    $project_page_id = get_option('my_project_archive_page');

    // get all pages
    $args = array(
        'posts_per_page'   => -1,
        'orderby'          => 'name',
        'order'            => 'ASC',
        'post_type'        => 'page',
    );
    $items = get_posts( $args );

    echo '<select id="my_project_archive_page" name="my_project_archive_page">';
    // empty option as default
    echo '<option value="0">'.__('— Select —', 'wordpress').'</option>';

    // foreach page we create an option element, with the post-ID as value
    foreach($items as $item) {

        // add selected to the option if value is the same as $project_page_id
        $selected = ($project_page_id == $item->ID) ? 'selected="selected"' : '';

        echo '<option value="'.$item->ID.'" '.$selected.'>'.$item->post_title.'</option>';
    }

    echo '</select>';
}

この後、Settings> Readingの下に新しいドロップダウンフィールドができます。
フィールドはすべてのページで埋められています。ページを1つ選択して設定を保存できます。


だから今、あなたはadminのページリストのこの選択されたページをmarkしたいです。これらのマーキングはstate/sと呼ばれます。 WordPressはフィルタを使用してこれらのテキストをdisplay_post_statesというタイトルに追加します。

/**
 * Add custom state to post/page list
 */
add_filter('display_post_states', 'prfx_add_custom_post_states');

function prfx_add_custom_post_states($states) {
    global $post;

    // get saved project page ID
    $project_page_id = get_option('my_project_archive_page');

    // add our custom state after the post title only,
    // if post-type is "page",
    // "$post->ID" matches the "$project_page_id",
    // and "$project_page_id" is not "0"
    if( 'page' == get_post_type($post->ID) && $post->ID == $project_page_id && $project_page_id != '0') {
        $states[] = __('My state', 'textdomain');
    }

    return $states;
}
4
LWS-Mo