WordPressの記事が多めの金沢です。今回は、管理画面の記事投稿ページにおけるカスタマイズの1つを紹介させて頂きます。
固定ページなどでは「親」を設定することで、ホームページの階層構造がわかりやすく整理させることができます。この「親」を選択するセレクトボックスのリストを調整したいと思われたことはないでしょうか? 固定ページではあまり調整の必要性は感じられませんが、カスタム投稿を階層構造にしたときに、投稿数が多くなると指定したい親が探しづらくなります。そこで、選択肢をトップ階層の記事だけにすれば簡単に見つけられます。それはフィルターフックで簡単に実現できまして、そのフックを用いれば選択肢の制限以外のカスタマイズもできるようです。
フィルターフック「page_attributes_dropdown_pages_args」
親の選択が可能な「ページ属性」のメタボックスは「page_attributes_meta_box」というWordPressのテンプレート関数により中身が生成されます(Code Reference – WordPress.org)。以下に関数のソースの前半部分だけを載せさせていただきます。
// ソースフォルダの場所: wp-admin/includes/meta-boxes.php function page_attributes_meta_box($post) { $post_type_object = get_post_type_object($post->post_type); if ( $post_type_object->hierarchical ) { $dropdown_args = array( 'post_type' => $post->post_type, 'exclude_tree' => $post->ID, 'selected' => $post->post_parent, 'name' => 'parent_id', 'show_option_none' => __('(no parent)'), 'sort_column' => 'menu_order, post_title', 'echo' => 0, ); /** * Filter the arguments used to generate a Pages drop-down element. * * @since 3.3.0 * * @see wp_dropdown_pages() * * @param array $dropdown_args Array of arguments used to generate the pages drop-down. * @param WP_Post $post The current WP_Post object. */ $dropdown_args = apply_filters( 'page_attributes_dropdown_pages_args', $dropdown_args, $post ); $pages = wp_dropdown_pages( $dropdown_args ); if ( ! empty($pages) ) { ?> <p><strong><?php _e('Parent') ?></strong></p> <label class="screen-reader-text" for="parent_id"><?php _e('Parent') ?></label> <?php echo $pages; ?> <?php } // end empty pages check } // end hierarchical check. // 以下省略
こちらのソースを拝見すると「wp_dropdown_pages」という関数が親選択のリストを生成しているようです。そして、WordPressのバージョン3.3以降では、「wp_dropdown_pages」が呼び出される直前の「page_attributes_dropdown_pages_args」というフィルターフックで、「wp_dropdown_pages」のパラメータが調整できることがわかります。「wp_dropdown_pages」のパラメータは「WordPress Codex」をご覧下さい。日本語版のページでも確認できます。
親の選択肢をトップ階層の記事だけにしてみました
ドロップダウンリストをトップ階層の投稿だけにするには、「wp_dropdown_pages」のパラメータ「depth」を「1」に指定するだけで済ませれます。従って、下記のようなコードをfunctions.phpに書き足せばよいのです。
function online_dropdown_pages_args( $dropdown_args, $post ) { $dropdown_args['depth'] = 1; return $dropdown_args; } add_filter( 'page_attributes_dropdown_pages_args', 'online_dropdown_pages_args' );
しかし、これでは固定ページを含んだ全ての投稿タイプに反映されてしまいます。仮に、カスタム投稿タイプ「custom」だけに反映させたい場合は下記のコードになります。
function online_dropdown_pages_args( $dropdown_args, $post ) { if ( 'custom' == $dropdown_args['post_type'] ) { $dropdown_args['depth'] = 1; } return $dropdown_args; } add_filter( 'page_attributes_dropdown_pages_args', 'online_dropdown_pages_args' );
「$dropdown_args」のキー「post_type」に、編集中の投稿タイプ名があらかじめセットされていましたので、その値から条件分岐しました。これで任務完了であります。
あとがき
WordPressは、コアファイルは極力触らないほうがよいですので、管理画面のカスタマイズはやりにくいように思えますが、フィルターフックやアクションフックを使用すれば割と自由にカスタマイズできてしまいます。WordPressのコアファイルには、カスタマイズしやすいようにいろんなところにフックが設置されています。この仕組みのお陰で様々なケースにも対応できてしまうのですから、WordPressの開発者は本当に凄いですね。
金沢