WordPressで標準投稿にアーカイブ機能を付加する方法
作成日:
2020年8月25日
WordPressに標準で入っている「投稿」。これに投稿タイプアーカイブの機能を持たせて、例えば
Shell
https://hogehoge.com/blog
と表示すれば、すべての投稿一覧がアーカイブとして表示される方法を改めて考えます。
コード
PHP functions.php
function add_post_add_archive( $args, $post_type ) {
$slug = 'blog';
$args['rewrite'] = true;
$args['has_archive'] = $slug;
global $wp_rewrite;
$archive_slug = $wp_rewrite->root . $slug;
add_rewrite_rule( "{$archive_slug}/?$", "index.php?post_type=$post_type", 'top' );
add_filter( 'post_type_archive_link', function( $link, $post_type ) {
if ( 'post' === $post_type ) {
$post_type_object = get_post_type_object( 'post' );
$slug = $post_type_object->has_archive;
$link = get_home_url( null, '/' . $slug . '/' );
}
return $link;
}, 10, 2 );
}
add_filter( 'register_post_type_args', 'add_post_add_archive', 10, 2 );
コードの解説
- まず最初に関数に設定している引数
$args
が$post_type
の設定値になります。PHP functions.php [1]function add_post_add_archive( $args, $post_type ) {
- 投稿タイプアーカイブで使用する投稿タイプ名を指定します。PHP functions.php [2]
$slug = 'blog';
- 標準投稿タイプにアーカイブを設定します。PHP functions.php [3-4]
$args['rewrite'] = true; $args['has_archive'] = $slug;
- 指定した投稿タイプアーカイブURL表示時にアーカイブ表示されるようにリライトルールを設定します。PHP functions.php [5-7]
global $wp_rewrite; $archive_slug = $wp_rewrite->root . $slug; add_rewrite_rule( "{$archive_slug}/?$", "index.php?post_type=$post_type", 'top' );
- このままだと
post_type_archive_link
やメニューで出力される投稿タイプアーカイブリンクが標準のままなのでフィルターで変更します。PHP functions.php [8-15]add_filter( 'post_type_archive_link', function( $link, $post_type ) { if ( 'post' === $post_type ) { $post_type_object = get_post_type_object( 'post' ); $slug = $post_type_object->has_archive; $link = get_home_url( null, '/' . $slug . '/' ); } return $link; }, 10, 2 );
これで一応想定した形にはなりました。
でも
まだ問題が
残ってそう...
な気はします。
物草 灸太郎
WordPressでホームページを制作しつつ、休日は畑を耕したりDIYを楽しんでいます。
コメントをどうぞ