Amazonで商品を見る セール会場へ

WordPress│複数の著者(ユーザー)を記事一覧に登録する方法

共同著者を含む著者ページで、対象ユーザーの情報と既存の1ページあたりの件数を保持します。

記事上の著者表示ではIDを検証し、重複ユーザーと存在しないユーザーを除外します。

WordPressで複数人の著者が関わるメディアサイトを構築していると、「author.php(著者ページ)でそのユーザーが執筆した記事」と「共同編集者として関わった記事」の両方を表示したくなる場面があります。

本記事では、Advanced Custom Fields(ACF)で共同著者を管理し、 カスタムフィールドを使って author.php に正しく記事を表示させる方法を解説します。

記事ページ

本来の著者だけでなく、登録した追加ユーザーも掲載します。

記事ページで本来の著者に加えて登録した追加ユーザーも掲載されている表示例。

上の画像は2025年7月の操作・表示例です。

著者ページ

追加ユーザーをクリックすると関わった記事一覧が登録されています。

追加したユーザーの著者ページに関わった記事一覧が登録されている表示例。

上の画像は2025年7月の操作・表示例です。

目次

著者

WEB制作をしているデジタルノマド
WordPressのカスタマイズが好きで、色々と自作しています。

WordPressのカスタマイズに困ったらご相談ください!

複数の著者(ユーザー)を記事に登録する方法

カスタマイズの手順自体はシンプルです。

ACFにカスタムフィールドを追加する

Advanced Custom Fields (ACF)のプラグインを入れて、ユーザーのカスタムフィールド(co_author_id)を追加します。

  • フィールド名:co_author_id
  • フィールドタイプ:ユーザー(複数選択を使う場合は有効化、戻り値はユーザーID)
プラグインのカスタムフィールド設定でフィールド名とフィールドタイプを設定する画面。

上の画像は2025年7月の操作・表示例です。

記事に追加のユーザーを登録する

記事下にカスタムフィールドがあるのでプルダウンから追加のユーザーを登録します。

記事編集画面下のカスタムフィールドのプルダウンから追加ユーザーを登録する操作画面。

上の画像は2025年7月の操作・表示例です。

記事タイトル横に追加ユーザーを表示する(SWELL)

これは別のカスタマイズなので割愛しますが、記事タイトルのテンプレート(parts/single/post_head.php)にコードを追加してあげているだけです。

テンプレートを編集して記事タイトル横に追加ユーザーを表示させた画面。

上の画像は2025年7月の操作・表示例です。

ユーザーページの投稿一覧に登録する

あとは記事に追加したユーザーを紐づけるだけです。

紐づけすると著者ページの記事一覧にも関連した記事が表示されます。

紐づけ後に著者ページの記事一覧へ関連した記事が表示されている画面。

上の画像は2025年7月の操作・表示例です。

一覧用コードを子テーマのfunctions.phpまたはCode Snippetsへ追加します。

記事タイトル横に追加ユーザーを表示するカスタマイズのコードも最後に掲載しております。

エラーが怖い人はCode Snippetsのプラグインを入れて、そこからコードを挿入しましょう。

pre_get_posts フィルターで投稿一覧をカスタマイズ

ポイントは以下の3点です。

  • クエリの著者IDまたはユーザースラッグから対象ユーザーを取得し、queried_objectに保持
  • get_post_meta()の単一ID・配列を判別し、正の整数IDだけを採用
  • post__in で明示的に対象の投稿IDを制限
add_action( 'pre_get_posts', function ( WP_Query $q ) {
	if ( is_admin() || ! $q->is_main_query() || ! $q->is_author() ) return;

	$author_id = absint( $q->get( 'author' ) );
	if ( ! $author_id && $q->get( 'author_name' ) ) {
		$user = get_user_by( 'slug', $q->get( 'author_name' ) );
		$author_id = $user ? (int) $user->ID : 0;
	}
	if ( ! $author_id ) return;

	$author = get_userdata( $author_id );
	if ( ! $author ) return;
	$q->queried_object = $author;
	$q->queried_object_id = $author_id;

	$ids_direct = get_posts([
		'post_type' => 'post',
		'author' => $author_id,
		'posts_per_page' => -1,
		'fields' => 'ids',
	]);

	$possible_ids = get_posts([
		'post_type' => 'post',
		'posts_per_page' => -1,
		'fields' => 'ids',
		'meta_key' => 'co_author_id',
	]);

	$ids_co = [];
	foreach ( $possible_ids as $post_id ) {
		$raw = get_post_meta( $post_id, 'co_author_id', true );
		$values = is_array( $raw ) ? $raw : array( $raw );
        $co_authors = array();
        foreach ( $values as $value ) {
            if ( (is_int($value) || is_string($value)) && preg_match('/^[1-9][0-9]*$/D', (string) $value) ) {
                $co_authors[] = (int) $value;
            }
        }
        if ( in_array( $author_id, $co_authors, true ) ) $ids_co[] = $post_id;
	}

	$all_ids = array_unique( array_merge( $ids_direct, $ids_co ) );
    $existing = $q->get('post__in');
    if (is_array($existing) && $existing) $all_ids = array_values(array_intersect($all_ids, array_map('absint', $existing)));

    // WP_Queryはpost__in指定時にpost__not_inをSQLへ併用しないため、先に除外する。
    $excluded = array_map( 'absint', (array) $q->get( 'post__not_in' ) );
    $all_ids = array_values( array_diff( $all_ids, $excluded ) );

	if ( empty( $all_ids ) ) {
		$q->set( 'post__in', [ 0 ] );
		return;
	}

	$q->set( 'post__in', $all_ids );
	$q->set( 'orderby', 'date' );
	$q->set( 'order', 'DESC' );
	$q->set( 'author', '' );
	$q->set( 'author_name', '' );
}, 11 );

最後に確認しましょう。

コード追加後の表示結果を確認している画面。

上の画像は2025年7月の操作・表示例です。

おまけ│記事タイトルに追加ユーザーを掲載するカスタマイズ

現在の親テーマのparts/single/post_head.phpをバックアップし、子テーマの同じパスへコピーして編集します。

親テンプレートにあるuse SWELL_Theme as SWELL;を残し、著者を出力する部分だけを置き換えます。

すでにPHPの開始タグ内へ貼る場合は、下の例の<?phpと?>を重ねて貼りません。

記事タイトル横に追加ユーザーを掲載するカスタマイズを行った画面。

上の画像は2025年7月の操作・表示例です。

元のコード

// 著者
if ( SWELL::get_setting( 'show_meta_author' ) ) :
	$post_data = get_post( $the_id );
	SWELL::pluggable_parts( 'the_post_author', [ 'author_id' => $post_data->post_author ] );
endif;

記事タイトル横に追加ユーザーを表示する(SWELL)

<?php
if ( SWELL::get_setting( 'show_meta_author' ) ) :
    $post_data = get_post( $the_id );
    if ( $post_data ) {
        $main_author = (int) $post_data->post_author;
        $raw = get_post_meta( $the_id, 'co_author_id', true );
        $values = is_array( $raw ) ? $raw : array( $raw );
        $author_ids = array( $main_author );
        foreach ( $values as $value ) {
            if ( ( is_int( $value ) || is_string( $value ) )
                && preg_match( '/^[1-9][0-9]*$/D', (string) $value ) ) {
                $author_ids[] = (int) $value;
            }
        }
        foreach ( array_unique( $author_ids ) as $author_id ) {
            if ( get_userdata( $author_id ) ) {
                SWELL::pluggable_parts( 'the_post_author', array( 'author_id' => $author_id ) );
            }
        }
    }
endif;
?>

共同著者の記事一覧でページ送りを試す

主著者の記事1件と、別の主著者が執筆した共同記事2件を用意して、共同著者の一覧を実SWELLで確認しました。1ページ2件の既存条件を保つと、1ページ目には共同記事2件、2ページ目には主著者の記事が表示されます。共同著者に指定していない別著者の記事は、一覧に入りませんでした。

2のリンクをEnterで開いても、一覧上部の著者名は対象ユーザーのままです。スマホ幅390pxで2ページ目を確認し、1のリンクから戻ることも確認しました。導入先でも主著者・共同著者・対象外の記事を用意し、1ページ目だけで判断せず2ページ目まで開いてください。

この一覧確認では、保存済みのco_author_idを使う著者クエリを検証しました。

追加の保存・表示確認は下の節で説明します。

既存フィールドの返り値がユーザーIDかユーザー情報の配列かを確認してから適用してください。

記事数が多い環境では候補IDを取得する負荷も別途確認します。戻す場合は追加した著者クエリの処理と上書きパーツを原本へ戻します。共同著者の保存データを削除する必要はありません。

共同著者を含む一覧の2ページ目に主著者の記事を表示したスマホ画面
2026年10月2日、隔離WordPressで撮影した実画面です。

保存した共同著者を記事タイトル付近に表示する

共同著者の登録、著者一覧への記事追加、記事タイトル付近の著者名表示は、それぞれ別の設定です。

ACFのユーザーフィールドをco_author_idという名前で用意し、複数選択を許可してユーザーIDを返す設定にすると、登録する値を確認しやすくなります。

投稿編集画面の共同著者欄でユーザーを選び、投稿を更新します。

編集画面を開き直して選択が残っていることを確認してから、公開画面の表示を調べてください。

掲載しているthe_post_authorの置き換え先は、SWELL 2.19.0ではparts/single/post_head.phpにある記事タイトル付近の著者表示です。

子テーマに同じ相対パスでコピーし、その著者表示部分を差し替えます。

親テーマのファイルを直接編集すると更新時に変更が失われるため、変更前のコピーも保存してください。

隔離環境では、ACF 6.8.10の実際の投稿編集欄で「共同著者B」を選択して更新し、再読込後も選択が残りました。

子テーマの表示部分に掲載コードを適用すると、タイトルの下に「主著者A」と「共同著者B」が表示されました。

共同著者名をEnterキーで開くと、共同著者の見出しと登録した記事が一覧に表示されました。

本文下の著者紹介や投稿一覧の著者表示は別のパーツなので、この差し替えだけでは変更されません。

戻す場合は、子テーマの変更部分を保存した原本へ戻し、不要になった共同著者の選択を解除して投稿を更新します。

共同著者を保存した記事のタイトル付近の著者名
共同著者を保存した記事のタイトル付近の著者名。2026年10月3日、隔離したWordPress 7.1.2 / SWELL 2.19.0で撮影。

一覧から除外する記事と公開状態を確認する

スクロールできます
入力条件掲載コードの結果
共同著者の公開記事2件から1件をpost__not_inで除外残った1件だけを表示し、総件数も1件
対象の公開記事をすべて除外空の一覧になる
post__inで2件を指定し、post__not_inで1件を除外両方の条件を満たす1件だけを表示
共同著者の下書き・非公開記事が同時に存在する未ログインの著者一覧に公開記事だけを表示
下書きだけを指定した別のクエリこの例の候補取得は公開記事に限るため、下書き一覧には使えない

WordPressでは、post__inを設定するとpost__not_inはSQLへ併用されません。

上の一覧用PHPは、候補IDからpost__not_inのIDを先に取り除きます。

仕様はWP_Queryの公式資料も参照してください。

WordPress 7.1.2の実際のメインクエリで、除外指定、1件ごとのページサイズ、総件数、post__inとの併用を確認しました。

共同著者の候補は公開状態の投稿から取得します。

この条件を、別の独自クエリ全体のアクセス権を保証する仕組みとしては使わないでください。

一覧用PHPを入れ替える前に原本を保存し、既存の同名フックを二重登録しないでください。

戻すには一覧用PHPを原本へ戻します。

共同著者の保存データや表示用パーツを変更する必要はありません。

設置後の確認と戻し方

SWELLの著者表示を有効にし、主著者だけの記事、共同著者だけで紐づく記事、複数選択した記事を確認します。

一覧のコードは標準投稿の公開記事を対象に候補を全件取得するため、大規模サイトの性能やカスタム投稿タイプへの拡張は別途検討が必要です。

ローカルWordPressの実DBとSWELLで、著者IDの保持、タクソノミーとの絞り込み、重複除外と著者リンクの出力を確認しました。

隔離環境では、ACFの投稿編集欄で共同著者を保存し、PCの記事タイトル付近と著者一覧への移動を確認しました。

フィールドグループの管理画面での作成、スマホ表示、他の一覧カスタマイズとの併用は未検証です。

戻す場合は一覧用のフックを停止し、子テーマの変更したテンプレートをバックアップから戻します。

保存済みの共同著者メタはこの操作では削除されません。

  • URLをコピーしました!

実装を任せたい方へ

WordPressのカスタマイズ代行

ブロックの追加、テーマの改修、管理画面の調整など、記事で紹介している内容の実装を承ります。1時間 ¥8,000〜(税込)。

WAZAの有料記事のサブスクリプションも開始しました。

サービス

Service

WordPressサイトのカスタマイズのサービスに関心がありましたら、ぜひ詳細をご覧ください。

目次