web-dev-qa-db-fra.com

Page de l'auteur Custom Query WHERE author OR [post meta value] OR [post meta value]

J'essaie actuellement d'effectuer une requête personnalisée sur la page des auteurs (author.php). J'ai deux champs personnalisés pour les publications que je souhaite interroger (post_photographer et post_videographer).

Ce que j'essaie de faire pour le profil de l'auteur, c'est d'obtenir toutes les publications du profil de l'utilisateur actuel où l'utilisateur est:

  • l'auteur du post
  • OU le photographe post
  • OU le post-vidéographe

Ainsi, le profil de chaque personne PEUT avoir des messages qu’il n’a pas écrits (c’est plutôt le photographe ou le vidéographe).

Le code suivant est proche de ce que je veux, mais le problème est qu’il récupère les publications où l’utilisateur actuel est l’auteur ET est une publication. photographe OU poste vidéaste. Ce doit être l'endroit où l'utilisateur actuel est l'auteur OU post photographe OU poste vidéographe.

$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 );

Est-ce possible via des requêtes WordPress (query_posts ou WP_Query) ou dois-je écrire du SQL personnalisé? Toute aide est grandement appréciée! Si vous avez besoin d'éclaircissements, veuillez demander.

2
Chris Hayes

Pour ceux qui ont un besoin similaire, j'ai résolu ceci de la manière suivante (sur authors.php):

D'abord je reçois l'ID de l'auteur:

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

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

J'ai ensuite créé une requête personnalisée:

        $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 
        ";

Et enfin, utilisez ce qui suit pour obtenir les résultats:

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

Voici une version simplifiée de ma boucle pour afficher les résultats:

<?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; ?>

J'espère que ça aidera quelqu'un!

0
Chris Hayes