カスタム投稿タイプ

カスタム投稿タイプを定義

/**
 * カスタム投稿タイプ 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/にする。

  1. post_type_linkを使って、functions.phpにカスタム投稿タイプexampleのパーマリンクを定義
  2. rewrite_rules_arrayを使ってrewrite_rulesに上記のルールを追加
  3. 管理画面 > 設定 > パーマリンク設定を更新(リライトルールを再生成させるため)
// カスタム投稿タイプ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