Abfrage post_title ODER meta_query

Lesezeit: 3 Minuten

Benutzeravatar von user2874008
Benutzer2874008

Ich suche nach einer Lösung für mein Problem mit benutzerdefinierten WordPress-Abfragen. Ich habe ein Suchformular, in das der Benutzer einen Text eingeben kann, dieser Text kann ein Wort aus dem sein post_title oder ein meta_value (Company ID).

Ich muss die Zeichenfolge in suchen post_title Oder der meta_key-Field “ID-Nummer”, aber ich habe auch einige andere zusätzliche Suchparameter. Dies sind meine Argumente für die WP_Query:

Array(
    [post_type] => company
    [pagination] => 1
    [posts_per_page] => 10
    [paged] => 1
    [meta_query] => Array
        (
            [relation] => AND
            [0] => Array
                (
                    [0] => Array
                        (
                            [key] => id-number
                            [value] => FOOBAR
                        )

                    [1] => Array
                        (
                            [key] => post_title
                            [value] => FOOBAR
                            [compare] => LIKE
                        )

                    [relation] => OR
                )

            [1] => Array
                (
                    [relation] => AND
                    [0] => Array
                        (
                            [0] => Array
                                (
                                    [key] => country
                                    [value] => USA
                                )
                            [relation] => OR
                        )
                )
        )
)

Array[meta_query][0][1] (post_title) ist nur ein Platzhalter – ich weiß, das kann nicht funktionieren, aber wie kann ich suchen?
(id-number OR post_title) UND (all other vars...)

  • Ich glaube nicht, dass Sie post_title in einer Metaabfrage verwenden können, da es nicht in der post_meta-Tabelle gespeichert ist.

    – Chris Herbert

    5. Januar 2015 um 7:21 Uhr

Benutzeravatar von vicvicvic
vicvicvic

Dies ist mit WP_Query nicht direkt möglich. Die Abfrage wird aus den Argumenten im monströsen (über 1000 Zeilen lang) WP_Query::get_posts -Methode (siehe wp-includes/query.php) als meist eine lange Reihe von Verkettungen von AND Aussagen zu a $where Variable.1

Jetzt können Sie sich in eine Reihe von Filtern einklinken, um anzupassen, wie diese Variable (die die SQL für die Abfrage enthält) aufgebaut ist. In Ihrem Fall könnte eine der folgenden Optionen geeignet sein:

  • Beiträge_Suche: Lässt Sie ändern, wie Suchanfragen interpretiert werden (aus dem integrierten/Standard-Suchformular von WordPress). Dann würden Sie Ihre Where-Abfrage nach Bedarf manuell aus der Suchabfrage erstellen.
  • Beiträge_wo: Lässt Sie die gesamte Where-Abfrage ändern – allerdings für jede Abfrage.

Mit Filter würden Sie nicht wirklich Argumente an WP_Query senden und es auf “normale Weise” erstellen, sondern überschreiben, wie die SQL WHERE-Abfrage erstellt wird. Möglicherweise ist es besser, nur Ihre eigene SQL-Abfrage vollständig auszuführen. Der Kodex hat einen Artikel Anzeigen von Beiträgen mit einer benutzerdefinierten Auswahlabfrage das beschreibt, wie dies geschehen kann.


1. WP_Query ist keineswegs ein vollständiges ORM, sondern eine dedizierte Klasse zum Verwenden von Abfragezeichenfolgenvariablen und zum Filtern von Beiträgen basierend auf diesen Regeln.

Es gibt eine gebrauchsfertige Copy & Paste-Lösung von Adam Balee – und mit kurz meine ich 50 Zeilen inklusive Kommentare.

Es verwendet nur drei einfache Haken:

  • posts_join zu JOIN-hinzufügen meta_value Felder zur Abfrage
  • Beiträge_wo WHERE-Abfrageteil zu ändern und hinzuzufügen meta_value WIE % kurz nach dem post_title LIKE-Anweisung
  • posts_distinct Haken zum Entfernen von Duplikaten, die durch die zuvor hinzugefügte JOIN-Anweisung erstellt wurden

Um die Stackoverflow-Puristen glücklich zu machen, werde ich die Lösungen von Adams hier einfügen, aber besuchen Sie Adams Blog für detaillierte Erklärungen.

<?php
/**
 * Extend WordPress search to include custom fields
 *
 * https://adambalee.com
 */

/**
 * Join posts and postmeta tables
 *
 * http://codex.wordpress.org/Plugin_API/Filter_Reference/posts_join
 */
function cf_search_join( $join ) {
    global $wpdb;

    if ( is_search() ) {    
        $join .=' LEFT JOIN '.$wpdb->postmeta. ' ON '. $wpdb->posts . '.ID = ' . $wpdb->postmeta . '.post_id ';
    }

    return $join;
}
add_filter('posts_join', 'cf_search_join' );

/**
 * Modify the search query with posts_where
 *
 * http://codex.wordpress.org/Plugin_API/Filter_Reference/posts_where
 */
function cf_search_where( $where ) {
    global $pagenow, $wpdb;

    if ( is_search() ) {
        $where = preg_replace(
            "/\(\s*".$wpdb->posts.".post_title\s+LIKE\s*(\'[^\']+\')\s*\)/",
            "(".$wpdb->posts.".post_title LIKE $1) OR (".$wpdb->postmeta.".meta_value LIKE $1)", $where );
    }

    return $where;
}
add_filter( 'posts_where', 'cf_search_where' );

/**
 * Prevent duplicates
 *
 * http://codex.wordpress.org/Plugin_API/Filter_Reference/posts_distinct
 */
function cf_search_distinct( $where ) {
    global $wpdb;

    if ( is_search() ) {
        return "DISTINCT";
    }

    return $where;
}
add_filter( 'posts_distinct', 'cf_search_distinct' );

1428920cookie-checkAbfrage post_title ODER meta_query

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy