Ich muss ein WP_Query
mit LIKE
auf das machen post_title
.
Ich habe mit diesem regulären angefangen WP_Query
:
$wp_query = new WP_Query(
array (
'post_type' => 'wp_exposants',
'posts_per_page' => '1',
'post_status' => 'publish',
'orderby' => 'title',
'order' => 'ASC',
'paged' => $paged
)
);
Aber was ich eigentlich machen möchte, sieht in SQL so aus:
$query = "
SELECT *
FROM $wpdb->posts
WHERE $wpdb->posts.post_title LIKE '$param2%'
AND $wpdb->posts.post_type = 'wp_exposants'
ORDER BY $wpdb->posts.post_title
";
$wpdb->get_results($query);
Die Ausgabe druckt die Ergebnisse, die ich erwarte, aber ich benutze die reguläre <?php while ( $wp_query->have_posts() ) : $wp_query->the_post(); ?>
, um die Ergebnisse anzuzeigen.
Und das funktioniert nicht mit $wpdb->get_results()
.
Wie kann ich das erreichen, was ich hier beschrieben habe?
$wpdb->prepare()
.prepare()
.$wpdb->prepare('LIKE "%s%%"', 'banana')
würde zurückkehren"LIKE ''banana'%'"
, also müssen wir die Abfrage selbst konstruieren und auch die Escape-Operation ausführen.prepare()
. Ja, das ist schwierig und ich musste es mehrmals versuchen, bevor ich mich darum kümmerte. Von etwas habe ich gerade:$wpdb->prepare( ' AND {$wpdb->posts}.post_title LIKE %s ', esc_sql( '%'.like_escape( trim( $term ) ).'%' ) )
. Und ich bin mir ziemlich sicher, dass dasesc_sql()
unnötig und nur paranoid ist.'
(Apostroph) nicht suchen können . Ich denke, es ist wegen der Flucht? Ich habe die Lösung noch nicht gefundenVereinfacht:
quelle
Wollte diesen Code aktualisieren, an dem ihr für WordPress 4.0 und höher gearbeitet habt, da esc_sql () in 4.0 höher veraltet ist.
Der Rest des Zeugs ist dasselbe.
Ich möchte auch darauf hinweisen, dass Sie die Variable s in WP_Query-Argumenten verwenden können, um Suchbegriffe zu übergeben, die auch nach dem Titel des Beitrags suchen, glaube ich.
So was:
quelle
search_prod_title
ist Sollte ich dies zu etwas anderem ändern?esc_sql
beraubt? Es ist nicht.$wpdb->escape
ist aber ... developer.wordpress.org/reference/functions/esc_sqlDa hier eine verwundbare Lösung veröffentlicht wurde, habe ich eine etwas vereinfachte und bereinigte Version.
Zunächst erstellen wir eine Funktion für den
posts_where
Filter, mit der Sie nur Posts anzeigen können, die bestimmten Bedingungen entsprechen:Nun fügen wir
cc_search_post_title
unseren Abfrageargumenten hinzu:Und schließlich wickeln Sie den Filter um die Abfrage:
Get_posts () verwenden
Bestimmte Funktionen, die Posts abrufen, führen keine Filter aus, sodass die von Ihnen angehängten posts_where-Filterfunktionen die Abfrage nicht ändern. Wenn Sie
get_posts()
vorhaben, Ihre Posts abzufragen, müssen Siesuppress_filters
in Ihrem Argumentarray den Wert false festlegen :Jetzt können Sie verwenden
get_posts()
:Was ist mit dem
s
Parameter?Der
s
Parameter ist verfügbar:Wenn Sie Ihren Suchbegriff in den
s
Parameter work einfügen und den Beitragstitel durchsuchen, wird auch der Beitragsinhalt durchsucht.Was ist mit dem
title
Parameter, der mit WP 4.4 hinzugefügt wurde?Übergabe eines Suchbegriffs an den
title
Parameter:Ist case sensitive und
LIKE
nicht%LIKE%
. Diese mittlere Suche nachhello
gibt keinen Beitrag mit dem TitelHello World
oder zurückHello
.quelle
Aufbauend auf anderen Antworten vor mir gebe ich diese Option über das Argument "title_filter_relation" an, um Flexibilität in der Situation zu bieten, in der Sie einen Beitrag suchen möchten, der ein Wort in einem Metafeld ODER im Titel des Beitrags enthält. In dieser Implementierung erlaube ich nur "OR" - oder "AND" -Eingaben mit dem Standardwert "AND".
Hier ist ein Beispiel für den Code in Aktion für einen sehr einfachen Beitragstyp "faq", bei dem die Frage der Beitragstitel selbst ist:
quelle
WP_Query
imposts_where
Filter darauf zugreifen zu können .