it-swarm.com.de

WP_Query "OR": Beiträge nach ID, Name oder Beitragstitel suchen?

Hey, aus irgendeinem Grund habe ich eine Funktion, die Posts entweder nach ID, Name oder Post-Titel suchen muss. Es sieht aus wie das:

/**
 * @param $name_or_id: Name or ID of the post to find
 * @param $posttype: The Post Type
 * @return null|WP_Post
 */
function r2o_find_post($name_or_id,$posttype) {

    if(is_numeric($name_or_id)) {
        $id = abs(intval($name_or_id));
        if($id > 0) {
            $post = get_post($id);
            if(is_object($post) && $post->post_type == $posttype) {
                return $post;
            }
        }
        return null;
    }

    $slargs = array(
        'post_title'        => $name_or_id,
        'post_type'   => $posttype,
        'post_status' => 'publish',
        'numberposts' => 1
    );
    $pt = get_posts($slargs);

    if(is_array($pt)) {
        return $pt[0];
    }
    return null;
}

In $ slargs kann ich jedoch nur Folgendes tun:

post_title => $name_or_id 
OR 
post_name => $name_or_id

Kann ich diese "OR" -Relation mit WP_Query/get_posts ausführen, ohne zwei separate Abfragen durchzuführen?

1
Blackbam

Die Klasse WP_Query unterstützt keine OR-basierte bedingte Abfrage für die Spalten derselben Tabelle. In diesem Fall müssen Sie also Ihre eigene SQL-Abfrage schreiben. Und da es eine Abfrage geben muss, um diesen einzelnen Beitrag zu erhalten, wird dies die Leistung nicht beeinträchtigen. :)

Ich habe Ihren Code jedoch etwas anders geschrieben. Auf diese Weise müssten Sie nicht sowohl get_post() als auch get_posts() verwenden. Nur ein Aufruf von get_posts() würde ausreichen. Hier ist das-

/**
 * @param $name_or_id: Name or ID of the post to find
 * @param $posttype: The Post Type
 * @return null|WP_Post
 */
function r2o_find_post( $name_or_id, $posttype ) {

    $slargs = array(
        'post_title'  => $name_or_id,
        'post_type'   => $posttype,
        'post_status' => 'publish',
        'posts_per_page' => 1,
    );

    if( is_numeric( $name_or_id ) ) {
        $id = abs( intval( $name_or_id ) );
        if( $id > 0 ) {
            unset( $slargs[ 'post_title' ] );
            $slargs['post__in'] = [ $name_or_id ];
        }
    }

    $pt = get_posts( $slargs );

    if( is_array($pt) ) {
        return $pt[0];
    }
    return null;
}

Meine obige Haupttheorie ist, dass wir die Argumente von get_posts() basierend auf dem Typ des name_or_id-Parameters manipulieren.

Hoffe das oben hilft.

1
CodeMascot