WordPressでカスタムフィールドを扱いやすくするプラグイン「Advanced Custom Fields」にある「関連」フィールドで、現在の記事を除外する、下書き・非公開記事の非表示、並び順を変えるなど、表示される記事内容をカスタマイズする際の備忘録です。

紹介する内容は「Advanced Custom Fields」を既に使用(有効化)している想定のものになります。

現在の投稿を除外する

新規投稿時には気になりませんが、デフォルトでは「関連」フィールド内に該当するすべての投稿が表示されるので、編集時などに現在編集している投稿も表示されます。
ほとんどの場合は現在の投稿を関連投稿として選択することはないと思うので非表示にします。

「関連」フィールド内の出力をカスタマイズしたい場合は、主にacf/fields/relationship/queryのフィルターフックを利用します。
実装にはfunctions.phpに下記のように記述し、WP_Queryなどで利用することも多いpost__not_inを使います。

functions.php
add_filter( 'acf/fields/relationship/query', 'custom_acf_relationship_query', 10, 3 );
function custom_acf_relationship_query( $args, $field, $post_id ) {
  $args['post__not_in'] = array( $post_id );
  return $args;
}

記述後に投稿画面を確認すると「関連」フィールド内から現在の投稿が除外されるのを確認できます。
ここでは現在の投稿なのでarray( $post_id )と指定していますが、何らかの理由で特定の投稿のみ出したくないというときも同じようにpost__not_inを利用し、その場合は$post_idをその該当の投稿IDに置き換えれば、指定した投稿が「関連」フィールドに表示されないようにできます。

公開済みの投稿のみ表示

「関連」フィールドの表示イメージ

「関連」フィールドを利用すると投稿画面にイメージのようなボックスが表示され、ここで関連記事として表示させたいものを選択していきますが、デフォルトだと下書き(draft)や非公開(private)な状態の投稿も選択一覧に表示されます。
ただ、ここで下書きや非公開状態の記事を選択することはほぼないでしょうし、そういった投稿が沢山あると邪魔になってくるので、それらを消して公開済みの投稿のみが表示されるようにします。

実装には下記をfunctions.phpに記述します。

functions.php
add_filter( 'acf/fields/relationship/query', 'custom_acf_relationship_query', 10, 3 );
function custom_acf_relationship_query( $args, $field, $post_id ) {
  $args['post_status'] = 'publish';
  return $args;
}

カスタマイズ後の「関連」フィールドの表示イメージ

記述後に関連記事選択部分を確認すると、もともと表示されていた下書きや非公開状態の投稿は表示されなくなり、公開済みの投稿のみが表示されているのを確認できます。

並び順を変更する

デフォルトでは記事の並び順はタイトル順になっていますが、それを日付やランダムで並ぶように設定する方法です。

日付順+昇順

並びを日付順+昇順にしたい場合は、下記をfunctions.phpに記述します。
昇順の指定についてはデフォルトの指定が昇順になっているので指定する必要はありません。

functions.php
add_filter( 'acf/fields/relationship/query', 'custom_acf_relationship_query', 10, 3 );
function custom_acf_relationship_query( $args, $field, $post_id ) {
  $args['orderby'] = 'date';
  return $args;
}

日付順+降順

並びを日付順+降順にしたい場合は、下記をfunctions.phpに記述します。

functions.php
add_filter( 'acf/fields/relationship/query', 'custom_acf_relationship_query', 10, 3 );
function custom_acf_relationship_query( $args, $field, $post_id ) {
  $args['orderby'] = 'date';
  $args['order'] = 'DESC';
  return $args;
}

ランダム

並びをランダムにしたい場合は、下記をfunctions.phpに記述します。
沢山記事があるのにいつも同じものを選択しがちな場合などに設定しておくと良いかもしれませんね。

functions.php
add_filter( 'acf/fields/relationship/query', 'custom_acf_relationship_query', 10, 3 );
function custom_acf_relationship_query( $args, $field, $post_id ) {
  $args['orderby'] = 'rand';
  return $args;
}

タイトル以外の情報も表示させる

デフォルトでは記事選択部分には基本的にタイトルのみが表示されていますが、そこへ日付や作成者など任意で別の情報も表示させる方法です。
関連フィールド内で表示させる情報はacf/fields/relationship/resultを使用することでカスタマイズが可能で、同じ記事タイトルにすることはほぼないと思うのでタイトル表示だけでも十分ではありますが、何らかの理由で別の情報も表示させたいというときに使えます。

「関連」フィールドにタイトル以外の情報も表示させたイメージ

ここではサンプルとして上のイメージ(右)のようにタイトルだけでなくその上に記事公開日も表示されるようにしていきます。
実装にはfunctions.phpへ下記のように記述し、デフォルトで記事タイトルのみを表示させている$titleの部分に日付と改行を追加しています。

functions.php
add_filter( 'acf/fields/relationship/result', 'custom_acf_relationship_result', 10, 4 );
function custom_acf_relationship_result( $title, $post, $field, $post_id ) {
  $rr_date = get_the_time( 'Y.m.d', $post->ID );
  $title = '[' . $rr_date . ']<br>' . $title;
  return $title;
}

同じ要領で他の情報を表示することも可能で、例えば下記のように記述すれば記事タイトル上に作成者を表示させることができます。

functions.php
add_filter( 'acf/fields/relationship/result', 'custom_acf_relationship_result', 10, 4 );
function custom_acf_relationship_result( $title, $post, $field, $post_id ) {
  $author_id = get_userdata( $post->post_author )->ID;
  $rr_author = get_the_author_meta( 'display_name', $author_id );
  $title = '[' . $rr_author . ']<br>' . $title;
  return $title;
}