カスタム投稿タイプ | WordPress
カスタム投稿タイプ
カスタム投稿タイプを定義
/**
* カスタム投稿タイプ example
*/
function create_example() {
$labels = array(
'name' => 'サンプル',
'singular_name' => 'サンプル',
'add_new' => 'サンプルを追加',
'add_new_item' => '新しいサンプルを追加',
'edit_item' => 'サンプルを編集',
'new_item' => '新しいサンプル',
'view_item' => 'サンプルを表示',
'search_items' => 'サンプルを探す',
'not_found' => 'サンプルはありません',
'not_found_in_trash' => 'ゴミ箱にサンプルはありません',
'parent_item_colon' => '',
);
$args = array(
'labels' => $labels,
'public' => true,
'capability_type' => 'post',
'hierarchical' => false, // 固定ページのように親子構造を持たない場合はfalse
'supports' => array( 'title' ),
);
register_post_type( 'example', $args );
}
add_action( 'init', 'create_example' );
※ 元のコードではadd_action('init', function create_example(){ ... })のように無名関数に関数名を付けていたが、これはPHPの構文として誤り(無名関数に名前は付けられない)。通常の名前付き関数として定義し、add_actionにコールバック名を渡す形に修正した。
カスタム投稿タイプのパーマリンク
カスタム投稿タイプのURLに関しては、ダッシュボードでの設定はできず、思ったようなURL構成にするのが難しい。
https://morilog.com/wordpress/post_type/post_type_permalink/
カスタム投稿タイプexampleのパーマリンクを、https://example.com/example/にする。
post_type_linkを使って、functions.phpにカスタム投稿タイプexampleのパーマリンクを定義rewrite_rules_arrayを使ってrewrite_rulesに上記のルールを追加管理画面 > 設定 > パーマリンク設定を更新(リライトルールを再生成させるため)
// カスタム投稿タイプexampleのパーマリンク設定
add_filter( 'post_type_link', function ( $link, $post ) {
if ( 'example' === $post->post_type ) {
return home_url( '/example/' . $post->ID );
}
return $link;
}, 1, 2 );
add_filter( 'rewrite_rules_array', function ( $rules ) {
$new_rules = array(
'example/([0-9]+)/?$' => 'index.php?post_type=example&p=$matches[1]',
);
return $new_rules + $rules;
});
追加したリライトルールは、$wp_rewriteオブジェクト(WP_Rewriteのインスタンス)のrulesプロパティに格納されるので、以下のようにして確認できる。
global $wp_rewrite;
var_dump( $wp_rewrite->rules );
※ 実際に反映されているルールはget_option( 'rewrite_rules' )でも確認できる。
参考
※ register_post_type()の第2引数のrewriteプロパティでもパーマリンク構造を設定できるが、挙動が分かりづらいため、常に上記の方法で設定するのが良い。
カスタム投稿タイプのループ
<?php $lastposts = get_posts( 'post_type=example&posts_per_page=2' ); ?>
<?php foreach ( $lastposts as $post ) : setup_postdata( $post ); ?>
<p><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></p>
<?php endforeach; ?>
<?php wp_reset_postdata(); ?>
カスタム投稿タイプの権限
以下、User Role Editorの利用を前提にする。
edit_権限にチェックを入れないと、投稿画面自体を表示できない。
カスタム投稿タイププラグイン
参考
- https://www.webdesignleaves.com/pr/wp/wp_custom_post_type.html