it-swarm.com.de

Autorenseite Benutzerdefinierte Abfrage WO Autor OR [Post-Meta-Wert] OR [Post-Meta-Wert]

Ich versuche gerade, eine benutzerdefinierte Abfrage auf der Autorenseite (author.php) durchzuführen. Ich habe zwei benutzerdefinierte Felder für Posts, für die ich eine Abfrage durchführen möchte (post_photographer und post_videographer).

Ich versuche, für das Profil des Autors alle Beiträge für das aktuelle Benutzerprofil abzurufen, in dem sich der Benutzer befindet:

  • der Autor des Beitrags
  • ODER der Post-Fotograf
  • ODER der Post-Videographer

Das Profil jeder Person KANN Posts enthalten, die sie nicht verfasst hat (sie waren stattdessen der Fotograf oder Videofilmer).

Der folgende Code entspricht ungefähr meinen Vorstellungen, aber das Problem ist, dass er Posts abruft, bei denen der aktuelle Benutzer der Autor ist UND entweder ein Post-Fotograf ist ODER Videofilmer posten. Der aktuelle Benutzer muss der Autor ODER Post-Fotograf ODER Post-Videofilmer sein.

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

Ist dies über WordPress-Abfragen (query_posts oder WP_Query) möglich oder muss ich benutzerdefiniertes SQL schreiben? Jede Hilfe wird sehr geschätzt! Wenn Sie eine Klärung benötigen, fragen Sie bitte.

2
Chris Hayes

Für alle, die ein ähnliches Bedürfnis haben, habe ich das folgendermaßen gelöst (auf authors.php):

Zuerst erhalte ich die Autorenkennung:

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

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

Ich habe dann eine benutzerdefinierte Abfrage erstellt:

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

Und schließlich verwenden Sie Folgendes, um die Ergebnisse zu erhalten:

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

Hier ist eine vereinfachte Version meiner Schleife, um die Ergebnisse anzuzeigen:

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

Ich hoffe das hilft jemandem!

0
Chris Hayes