カスタム投稿タイプを作成し、アーカイブページに静的ページをユーザーに選択させます。たとえば、投稿ページの下にあります。プロジェクトページを追加したいです。[Dropdown]
閲覧設定ページに別の静的ページオプションを追加する方法はありますか?変更するための既存のフックはありますか?
また、Pagesでこのように選択されたページをマークする方法はありますか?
更新:
/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の設定を変更する方法はありますか?
[投稿ページ]ドロップダウンフィールドの直下に新しいフィールドを追加することが可能かどうかはわかりませんが、少なくともこれを行う方法はありません。
しかし、あなたはただ読書設定ページに別のドロップダウンメニューを追加することができます。これはあなたの下になります。
これを行うには、まず新しい設定を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;
}