WordPressで標準投稿にアーカイブ機能を付加する方法

作成日:

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 );

コードの解説

  1. まず最初に関数に設定している引数$args$post_typeの設定値になります。
    PHP functions.php [Ln 1]
    function add_post_add_archive( $args, $post_type ) {
    
  2. 投稿タイプアーカイブで使用する投稿タイプ名を指定します。
    PHP functions.php [Ln 2]
    	$slug                = 'blog';
    
  3. 標準投稿タイプにアーカイブを設定します。
    PHP functions.php [Ln 3-4]
    	$args['rewrite']     = true;
    	$args['has_archive'] = $slug;
    
  4. 指定した投稿タイプアーカイブURL表示時にアーカイブ表示されるようにリライトルールを設定します。
    PHP functions.php [Ln 5-7]
    	global $wp_rewrite;
    	$archive_slug        = $wp_rewrite->root . $slug;
    	add_rewrite_rule( "{$archive_slug}/?$", "index.php?post_type=$post_type", 'top' );
    
  5. このままだとpost_type_archive_linkやメニューで出力される投稿タイプアーカイブリンクが標準のままなのでフィルターで変更します。
    PHP functions.php [Ln 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を楽しんでいます。

コメントをどうぞ

※ メールアドレスが公開されることはありません。