サポート » プラグイン » 複数著者をセットできるCo Authors PlusでのPrimary Author以外の記事表示

  • 解決済 kokorog

    (@kokorog)


    共著者がいる場合に複数著者をセットできるCo Authors Plusというプラグインを使っているのですが、
    https://wordpress.org/plugins/co-authors-plus/

    記事は無事に共著者を表示することができたのですが、別で著者一覧ページを作っていて、著者のプロフィールの下に各著者の最新記事3件を表示しています。
    そのとき、Co Authors PlusでPrimary Author(最初の著者)に設定されていない記事が呼び出せないことに気づきました。

    <?php
    	$users =get_users( array('orderby'=>display_name,'order'=>ASC,'exclude' => array(1),) ); //adminを除外
    	foreach($users as $user):
        $uid = $user->ID;
        $userData = get_userdata($uid);
    	$user_post_count = count_user_posts($uid);
    	 ?>

    とやっていて$user_post_countでは共著分もカウントされた数字になるのですが

    <?php $posts = get_posts("author=$user->ID&orderby=date&post_type=post&posts_per_page=3"); ?>

    で呼び出している最新3件の情報はPrimary Authorに設定されていないものが表示されない状態です。

    githubで情報を見たらAuthorで呼び出せるのがPrimary Authorのみっぽいことは分かったのですが、
    https://github.com/fusioneng/Co-Authors-Plus-Roles/blob/master/PROJECT.md

    All of this data should be exposed in the WP_Query API, so that queries like:

    のところに書いてある’role’を設定すればPrimary Author以外も呼び出せるのか?
    いろいろ試してみたのですが、上手くいかないのでもし分かる方がいらっしゃいましたら教えて頂けないでしょうか。

    <?php $posts = get_posts(“author=$user->ID&orderby=date&post_type=post&posts_per_page=3”); ?>
    の$user->IDを$coauthor->IDにしてしまうと該当の著者の$coauthorだけではなく全体の$coauthorが呼び出されてしまうようで上手くいきませんでした…

    どうぞ宜しくお願い致します。

2件の返信を表示中 - 1 - 2件目 (全2件中)
  • Co-Authors Plus のバージョン 3.1.1 のソースを見ると、メインクエリに限って正しく共著者を検索できるコードになっていました。さらに、メインクエリであっても query_posts を使って改変したメインクエリには効果がありません。

    そのため、やや強引ですが(テーマのテンプレートに)次のようなコードを書くと、共著者になっている投稿も取得できました。

    <?php
      $users = get_users( array(
        'orderby' => 'display_name',
        'order'   => 'ASC',
        'exclude' => array( 1 )	// adminを除外
      ) );
    
      // Co-Authors Plus が WHERE 句を改変できるように
      // wp_posts.post_author IN (1) を
      // (wp_posts.post_author = 1)  へ書き換える。
      function my_convert_author_checker( $where, $query ){
        global $wpdb;
    
        $where = preg_replace(
          '/ ' . $wpdb->posts . '\.post_author\s+IN\s+\((\d+)\) /',
          ' (' . $wpdb->posts . '.post_author = $1)',
          $where
        );
        return $where;
      }
      // Co-Authors Plus のフックより早く実行するため 9 を指定。
      add_filter( 'posts_where', 'my_convert_author_checker', 9, 2 );
    
      foreach( $users as $user ):
        $uid = $user->ID;
        $user_post_count = count_user_posts( $uid );
        echo "<br /><var>author: $user->user_nicename, count: $user_post_count</var>";
    
        // Co-Authors Plus のためにメインクエリを改変。
        query_posts( "author=$uid&orderby=date&post_type=post&posts_per_page=3" );
        while ( have_posts() ):
          the_post();
          $myauthor = get_the_author();
          $mytitle = get_the_title();
          $mydate = get_the_date();
          echo "<br />author: $myauthor , title: $mytitle , date: $mydate";
        endwhile;
        wp_reset_query();   // メインクエリを回復。
      endforeach;
    
      // フックを外す。
      remove_filter( 'posts_where', 'my_convert_author_checker', 9 );
    ?>

    Co-Authors Plus がどのような処理を行っているか、プラグインの co-authors-plus.php を読んでみてください。フィルター posts_where にフックされるプラグイン内の関数 posts_where_filter の中身です。

    トピック投稿者 kokorog

    (@kokorog)

    gblsm様

    ありがとうございます!
    頂いたコードで確かに意図した通りに表示することができました!

    メインクエリに限って正しく共著者を検索できるコードになっていました。さらに、メインクエリであっても query_posts を使って改変したメインクエリには効果がありません。

    なるほど、その後auther.phpで表示する著者の記事一覧ではPrimary Author以外の記事も一覧が取得できていることに気づいて、なぜ著者一覧のページで取得できないのか余計に分からなくなっていたのですが、どうしてなのかやっとわかりました。

    また、丁寧にコメントを書いてくださってありがとうございます。
    ソースだけでなく本体のどこを読めばいいのかまで教示していただいて、まだ完全には理解できていませんが、posts_where_filterを見たときに何をどうやっているのか、なぜそうなっているのか、辿る手がかりを頂けたのがうれしかったです。

    あまり日本ではメジャーでなさそうなプラグインなので回答を頂けてとても嬉しかったです。どうもありがとうございました。

2件の返信を表示中 - 1 - 2件目 (全2件中)
  • トピック「複数著者をセットできるCo Authors PlusでのPrimary Author以外の記事表示」には新たに返信することはできません。