it-swarm.com.de

WP Abfrage, wo der Titel mit einem bestimmten Buchstaben beginnt

Ich möchte mit WP_Query () nach Posts suchen und nur Posts auswählen, die mit einem bestimmten Buchstaben beginnen. Ich habe eine Reihe alter Posts mit Filtern vor 4.4 gefunden, aber seit 4.4 gibt es eine Titelsuche, die der WP_Query-Funktion hinzugefügt wurde.

 $q = new WP_Query( array('post_type'=>'post','title'=>'This Song Title') );

Dies gibt nur exakte Übereinstimmungen von Beiträgen mit dem Titel "This Song Title" zurück.

Ich möchte nur alle Posts zurückgeben, die in diesem Beispiel mit dem Buchstaben "T" beginnen.

Ich habe auch diesen Beitrag gefunden, der nie wirklich beantwortet wurde. Es ist die akzeptierte Antwort, aber ich verstehe nicht, wie sie die Frage überhaupt beantwortet. Wie Suche auf den ersten Buchstaben des Titels zu beschränken?

Andere Abfragefunktionen wie die Kommentarsuche und die Metasuche verfügen über einen "Vergleich" zum Hinzufügen von LIKE% zu Abfragen, der Titel scheint jedoch nicht zu stimmen.

4
Mark

Bei WP_Query ist dies nicht direkt ab Werk möglich. Wenn Sie jedoch den posts_where-Filter verwenden, um nach einem benutzerdefinierten Argument für WP_Query zu suchen, können Sie diese Funktionalität hinzufügen.

Angenommen, starts_with ist der Name des Arguments, das wir verwenden möchten, dann können wir posts_where filtern, um eine WHERE-Klausel hinzuzufügen, die die Ergebnisse auf diejenigen begrenzt, die mit dem angegebenen Wert beginnen, wenn in der Abfrage starts_with festgelegt wurde:

function wpse_298888_posts_where( $where, $query ) {
    global $wpdb;

    $starts_with = $query->get( 'starts_with' );

    if ( $starts_with ) {
        $where .= " AND $wpdb->posts.post_title LIKE '$starts_with%'";
    }

    return $where;
}
add_filter( 'posts_where', 'wpse_298888_posts_where', 10, 2 );

Mit diesem Filter können wir Posts wie diesen abfragen:

$query = new WP_Query( array(
    'starts_with' => 'M',
) );

Das gibt alle Beiträge zurück, die mit "M" beginnen.

Wenn Sie die Hauptabfrage filtern möchten, können Sie dieses Argument auch in pre_get_posts verwenden:

function wpse_298888_pre_get_posts( $query ) {
    if ( $query->is_main_query() ) {
        $query->set( 'starts_with', 'M' );
    }
}
add_action( 'pre_get_posts', 'wpse_298888_pre_get_posts' );
4
Jacob Peattie