web-dev-qa-db-ja.com

作成者ページのカスタムクエリ OR [メタ値を投稿] OR [メタ値を投稿]

私は現在作者ページ(author.php)でカスタムクエリを実行しようとしています。照会したい投稿のカスタムフィールドが2つあります(post_photographerとpost_videographer)。

私が作者のプロフィールのためにやろうとしているのは、ユーザーがいる現在のユーザープロフィールのすべての投稿を取得することです。

  • 投稿の作者
  • ポストカメラマンのまたは
  • 投稿ビデオ撮影者のまたは

そのため、各人物のプロフィールMAYには投稿しなかった投稿があります(代わりに写真家またはビデオグラファーでした)。

次のコードは私が欲しいものに近いですが、問題はそれが現在のユーザーが作者である投稿を取得するということですそしてはどちらかの投稿写真家ですまたは投稿ビデオグラファー。現在のユーザーが作者またはポストカメラマンまたはポストビデオグラファーである必要があります。

$args = array(
'author' => $posts[0]->post_author,
'meta_query' => array(
    'relation' => 'OR',
    array(
        'key' => 'post_photographer',
        'value' => $posts[0]->post_author,
        'type' => 'numeric'
    ),
    array(
        'key' => 'post_videographer',
        'value' => $posts[0]->post_author,
        'type' => 'numeric'
    )
  )
);
query_posts( $args );

これはWordPressクエリ(query_postsまたはWP_Query)で可能ですか、それともカスタムSQLを書く必要がありますか?任意の助けは大歓迎です!説明が必要な場合は質問してください。

2
Chris Hayes

同様のニーズがあるかもしれない人のために、私はこれを次のように解決しました(authors.php):

まず著者IDを取得します。

$author = get_user_by( 'slug', get_query_var( 'author_name' ) );

// ID is accessed this way:
$author_id = $author->ID;

それから私はカスタムクエリを作成しました:

        $query = "
                SELECT p.* 
                FROM   $wpdb->postmeta m 
                             JOIN $wpdb->posts p 
                                 ON p.id = m.post_id 
                WHERE  ( m.meta_key = 'medium_post_photographers' 
                                 AND m.meta_value = '$author->ID' ) 
                                OR ( m.meta_key = 'medium_post_videographers' 
                                         AND m.meta_value = '$author->ID' ) 
                                     AND p.post_status = 'publish' 
                UNION DISTINCT 
                SELECT * 
                FROM   $wpdb->posts p 
                WHERE  post_author = $author->ID 
                             AND p.post_status = 'publish' 
                GROUP  BY p.id 
                ORDER  BY post_date DESC 
        ";

そして最後に以下を使用して結果を取得します。

 $author_posts = $wpdb->get_results($query, OBJECT);   

これは、結果を表示するための私のループの簡略版です。

<?php if ( $author_posts ) : ?>
    <?php global $post; ?>
    <?php foreach ( $author_posts as $post ) : setup_postdata($post); ?>
        <h6><?php echo the_title(); ?></h6>
        ...
    <?php endforeach; ?>
<?php else: ?>
    <div class="alert">There are no posts in this category.</div>
<?php endif; ?>

これが誰かに役立つことを願っています!

0
Chris Hayes