Support » Plugins » Filter 'posts_where': Komplexer Filter mit Custom Fields möglich?

  • Gelöst winnewoerp

    (@joschi81)


    Hallo WordPress-Kenner,

    ich bin mir sicher, dass es unter euch Spezialisten gibt, die mir bei meinem Anliegen weiterhelfen können.

    Ich habe mir folgenden Filter für Titel und Inhalt der Beiträge erstellt (für eine Live-Suche mit jQuery):

    // additional filter to query "title like %...% or content like %...%"
    add_filter( 'posts_where', 'theme_title_content_like_posts_where', 10, 2 );
    function theme_title_content_like_posts_where( $where, &$wp_query ) {
        global $wpdb;
        if ( $post_title_content_like = $wp_query->get( 'post_title_content_like' ) ) {
            $where .= ' AND (' . $wpdb->posts . '.post_title LIKE \'%' . esc_sql( $wpdb->esc_like( $post_title_content_like ) ) . '%\' OR '. $wpdb->posts . '.post_content LIKE \'%' . esc_sql( $wpdb->esc_like( $post_title_content_like ) ) . '%\')';
        }
        return $where;
    }

    Das funktioniert wunderbar.

    Nun folgende Frage: Kann ich (möglichst unter Erweiterung derselben Filterfunktion) den Filter noch wie folgt erweitern (hier mal zur Verständlichkeit in semantisch nachvollziehbarer Form aufgeschrieben)?

    […] OR benutzerdefiniertes Feld ‚author-name‘ LIKE %suchbegriff% OR Name des Autors (post_author) LIKE %suchbegriff%

    Anders gefragt: Ist es möglich – und wenn ja: wie – den Filter ‚posts_where‘ so zu erweitern, dass man auch Werte aus anderen Datenbanktabellen berücksichtigen kann?

    Danke bereits für die Hilfe!

    Viele Grüße
    joschi81

Ansicht von 4 Antworten - 1 bis 4 (von insgesamt 4)
  • ja,
    reicht dir der Hinweis auf „meta query“?
    https://codex.wordpress.org/Class_Reference/WP_Meta_Query

    Thread-Ersteller winnewoerp

    (@joschi81)

    @monika: Danke für die Antwort. Aber ich glaube, ich komme hier mit meta_query nicht weiter. Ich muss ja innerhalb ein und desselben Filters (s.o.) die Bedingungen per OR miteinander verknüpfen können. Es geht ja darum, dass meine Live-Suche nicht nur Titel und Inhalt, sondern auch Username und author-name (wird befüllt, wenn der User beim Verfassen eines Beitrags nicht angemeldet war) mit filtert. Ich tippe im Moment, dass es auf komplexes SQL in dem posts_where-Filter hinausläuft.

    Hier sieht man den Filter, so wie oben im Code sichtbar, in Aktion:
    http://www.nextwien.at/#ideen
    (er filtert halt noch nicht den Nutzernamen mit)

    Weitere Tipps?

    Viele Grüße
    joschi81

    Thread-Ersteller winnewoerp

    (@joschi81)

    Ok, Aufgabenteil 1 erfolgreich erledigt. So kann man den Filter „posts_where“ erweitern, um nach einem String innerhalb von Titel, Inhalt oder Display-Namen des Users zu suchen:

    // additional filter to query "title like %...% or content like %...%" or post_author (display_name) like %...%
    add_filter( 'posts_where', 'theme_title_content_like_posts_where', 10, 2 );
    function theme_title_content_like_posts_where( $where, &$wp_query ) {
      global $wpdb;
      if ( $post_title_content_like = $wp_query->get( 'post_title_content_like' ) ) {
        $where .= ' AND (' . $wpdb->posts . '.post_title LIKE \'%' . esc_sql( $wpdb->esc_like( $post_title_content_like ) ) . '%\'';
        $where .= ' OR '. $wpdb->posts . '.post_content LIKE \'%' . esc_sql( $wpdb->esc_like( $post_title_content_like ) ) . '%\'';
        $where .= ' OR '. $wpdb->posts . '.post_author IN (SELECT ID FROM '.$wpdb->users.' WHERE display_name  LIKE \'%' . esc_sql( $wpdb->esc_like( $post_title_content_like ) ) . '%\' ))';
      }
      return $where;
    }

    Jetzt kommt Aufgabenteil 2: Einbeziehung meines benutzerdefinierten Feldes „author-name“.

    Habt ihr Tipps?

    Viele Grüße
    joschi81

    Thread-Ersteller winnewoerp

    (@joschi81)

    So, hier nun auch Teil 2: Suchfilter, der Titel, Inhalt, Autornamen (für angemeldete Benutzer Benutzername, für nicht angemeldete ein benutzerdefiniertes Feld) mit einbezieht.

    // additional filter to query "title like %...% or content like %...%" or post_author (display_name) like %...% or meta field author-name like %...%
    add_filter( 'posts_where', 'theme_title_content_like_posts_where', 10, 2 );
    function theme_title_content_like_posts_where( $where, &$wp_query ) {
      global $wpdb;
      if ( $post_title_content_like = $wp_query->get( 'post_title_content_like' ) ) {
        $where .= ' AND (' . $wpdb->posts . '.post_title LIKE \'%' . esc_sql( $wpdb->esc_like( $post_title_content_like ) ) . '%\'';
        $where .= ' OR '. $wpdb->posts . '.post_content LIKE \'%' . esc_sql( $wpdb->esc_like( $post_title_content_like ) ) . '%\'';
        $where .= ' OR '. $wpdb->posts . '.post_author IN (SELECT ID FROM '.$wpdb->users.' WHERE display_name  LIKE \'%' . esc_sql( $wpdb->esc_like( $post_title_content_like ) ) . '%\' )';
        $where .= ' OR '. $wpdb->posts . '.ID IN (SELECT post_id FROM '.$wpdb->postmeta.' WHERE (meta_key = \'author-name\' AND meta_value LIKE \'%' . esc_sql( $wpdb->esc_like( $post_title_content_like ) ) . '%\' )))';
      }
      return $where;
    }

    Ich hoffe, das Ganze ist nützlich für den ein oder anderen.

    Viele Grüße
    joschi81

Ansicht von 4 Antworten - 1 bis 4 (von insgesamt 4)
  • Das Thema „Filter 'posts_where': Komplexer Filter mit Custom Fields möglich?“ ist für neue Antworten geschlossen.