1投稿につき1著者がWordPressの原則
WordPressでは通常、1人の投稿に1人のユーザーしか割り当てることができず、1つの投稿を複数人で執筆した場合に対応することができません。個人ブログではなくメディアサイト等では、著者や編集者、カメラマン等複数人で1つの記事を作ることがあると思います。そのような際には1つの投稿に対して複数人の著者を表示する必要が出てきます。
完成予想図
手順1 Co-Authors Plus を導入
WordPressプラグインのCo-Authors Plusをインストールして有効化します。
このプラグインを導入すると、1投稿に対して複数の著者を登録することができます。
例えば、ある記事の著者として「ユーザーA」と「ユーザーB」の2人を登録できるようになります。
「ユーザーA」、「ユーザーB」どちらの投稿一覧画面を見ても、この記事が表示されます。
手順2 PHPテンプレートの編集
Co-Authors Plus を導入するとデータベース上では(管理画面では)1つの記事に複数著者が紐付けられます。しかし、あくまでデータベース上での複数著者紐付けが行われただけなので、webページの画面上で複数著者を表示させるには、WordPressのテーマをイジる必要があります。
WordPressのテーマテンプレートのPHPを編集することで、複数の著者を投稿に表示させることができます。
foreach文でプロフィール取得
Co-Authors Plusから、その記事の著者のユーザーIDを取得し、著者の人数分だけeach文でループさせます。
Co-Authors Plusを導入した状態で、WordPressのテーマに以下のコードを書くと、「表示名」「プロフィール詳細」が、その記事の著者の人数分だけ、それぞれ出力されます。
<?php $coauthors = get_coauthors(); ?>
<?php foreach( $coauthors as $coauthor ): ?>
<?php
$author = $coauthor->ID; //
the_author_meta('display_name', $author); // 表示名
the_author_meta('description', $author); // プロフィール詳細
?>
<?php endforeach; ?>
LION MEDIAのテンプレートを編集してみる
先程のコードは複数著者をベタで出力するだけなので、実際には使用中のWordPressテーマのレイアウト・CSSが適用されるようにコードを書かなくてはいけません。
ここでは、ブログでよく利用されている無料国産テーマのLION MEDIAを例に、1人の著者しか表示しないテーマを複数著者を表示させる仕様に書き換えます。
$author = $coauthor->ID
で、$authorにユーザーIDを代入し、 the_author_meta('display_name');
のような著者情報の出力部分に$authorを書き加え、 the_author_meta('display_name', $author);
のようにします。
この処理を、全ての著者情報に関するフィールドに対して行えば完成です。
LION MEDIA 以外のテンプレートでも同様の処理を行えばOKです。まずは、テンプレート内のプロフィール情報を表示させているコードを探し、foreachを適用させ、$authorを書き加える処理をするだけです。
LION MEDIA用の複数著者表示コード
個別投稿(single.php)内のプロフィール部分を全て削除し、以下のコードを記述する。
<?php $coauthors = get_coauthors(); ?>
<?php foreach( $coauthors as $coauthor ): ?>
<?php
$author = $coauthor->ID; // Co-author PlusからユーザーIDの取得
?>
<aside class="profile">
<div class="profile__imgArea">
<?php
$author_img = get_avatar($author);
$imgtag= '/<img.*?src=(["\'])(.+?)\1.*?>/i';
if(preg_match($imgtag, $author_img, $imgurl)){
$author_img = $imgurl[2];
}
?>
<?php if($myAmp){echo '<amp-img layout="responsive"';}else{echo '<img';} ?> src="<?php echo $author_img; ?>" alt="<?php echo the_author_meta('display_name', $author
); ?>" width="60" height="60" >
<?php if($myAmp){echo '</amp-img>';}?>
<ul class="profile__list">
<?php
if (get_the_author_meta('facebook', $author)) {
echo '<li class="profile__item"><a class="profile__link icon-facebook" href="'. esc_url(get_the_author_meta('facebook', $author)) .'"></a></li>';
}if (get_the_author_meta('twitter', $author)) {
echo '<li class="profile__item"><a class="profile__link icon-twitter" href="'. esc_url(get_the_author_meta('twitter', $author)) .'"></a></li>';
}if (get_the_author_meta('instagram', $author)) {
echo '<li class="profile__item"><a class="profile__link icon-instagram" href="'. esc_url(get_the_author_meta('instagram', $author)) .'"></a></li>';
}if (get_the_author_meta('gplus', $author)) {
echo '<li class="profile__item"><a class="profile__link icon-google" href="'. esc_url(get_the_author_meta('gplus', $author)) .'"></a></li>';
}
?>
</ul>
</div>
<div class="profile__contents">
<h2 class="profile__name">Author:<?php the_author_meta('display_name', $author); ?>
<span class="btn"><a class="btn__link btn__link-profile" href="<?php echo get_author_posts_url( get_the_author_meta( 'ID', $author ) ); ?>">投稿一覧</a></span>
</h2>
<?php if (get_the_author_meta('user_group', $author)) { echo'<h3 class="profile__group">'; echo esc_html(get_the_author_meta('user_group', $author)); echo'</h3>'; } ?>
<div class="profile__description"><?php the_author_meta('description', $author); ?></div>
</div>
</aside>
<?php endforeach; ?>
間違え、質問等あれば連絡ください!