Benutzerdefinierten Taxonomiebegriff in die Suche aufnehmen
-
-
Norcross,können Sie der von Jan vorgeschlagenen Antwortein Feedback hinzufügen?Suchen Sie wahrscheinlichein Plugin,das den Joberledigt?Nocross, can you add some feedback to the answer proposed by Jan? Are you probably looking for a plugin that does the job?
- 0
- 2010-11-06
- hakre
-
Am Ende habeich den Plan verworfen.Daich 3 separate Suchfunktionenerstellt hatte (basierend auf unterschiedlichen Anforderungenin bestimmten Bereichen),haben alle vonmirgetesteten Plugins diesegebrochen.Am Ende sagteich dem Kunden,er solle Begriffein den Inhalt aufnehmen,wenner durchsuchbar sein soll.I ended up ditching the plan. Since I had created 3 separate search functions (based on different needs in certain areas), all the plugins I tested broke those. In the end, I told the client to include terms in the content if they wanted it searchable.
- 0
- 2010-11-13
- Norcross
-
6 Antworten
- Stimmen
-
- 2010-12-15
Ich würde auch das Plugin Search Everything empfehlen. Wenn Sie diesjedochmithilfe der Suchfunktion von WPimplementierenmöchten,verwenden Sie denfolgenden Codein meinem Atom-Design:
// search all taxonomies, based on: http://projects.jesseheap.com/all-projects/wordpress-plugin-tag-search-in-wordpress-23 function atom_search_where($where){ global $wpdb; if (is_search()) $where .= "OR (t.name LIKE '%".get_search_query()."%' AND {$wpdb->posts}.post_status = 'publish')"; return $where; } function atom_search_join($join){ global $wpdb; if (is_search()) $join .= "LEFT JOIN {$wpdb->term_relationships} tr ON {$wpdb->posts}.ID = tr.object_id INNER JOIN {$wpdb->term_taxonomy} tt ON tt.term_taxonomy_id=tr.term_taxonomy_id INNER JOIN {$wpdb->terms} t ON t.term_id = tt.term_id"; return $join; } function atom_search_groupby($groupby){ global $wpdb; // we need to group on post ID $groupby_id = "{$wpdb->posts}.ID"; if(!is_search() || strpos($groupby, $groupby_id) !== false) return $groupby; // groupby was empty, use ours if(!strlen(trim($groupby))) return $groupby_id; // wasn't empty, append ours return $groupby.", ".$groupby_id; } add_filter('posts_where','atom_search_where'); add_filter('posts_join', 'atom_search_join'); add_filter('posts_groupby', 'atom_search_groupby');
Esbasiert auf dem Tag-Search-Plugin: http://projects.jesseheap.com/all-projects/wordpress-plugin-tag-search-in-wordpress-23
I would recommend the Search Everything plugin too, but if you want to implement this using WP's search function, here's the code I'm using in my Atom theme:
// search all taxonomies, based on: http://projects.jesseheap.com/all-projects/wordpress-plugin-tag-search-in-wordpress-23 function atom_search_where($where){ global $wpdb; if (is_search()) $where .= "OR (t.name LIKE '%".get_search_query()."%' AND {$wpdb->posts}.post_status = 'publish')"; return $where; } function atom_search_join($join){ global $wpdb; if (is_search()) $join .= "LEFT JOIN {$wpdb->term_relationships} tr ON {$wpdb->posts}.ID = tr.object_id INNER JOIN {$wpdb->term_taxonomy} tt ON tt.term_taxonomy_id=tr.term_taxonomy_id INNER JOIN {$wpdb->terms} t ON t.term_id = tt.term_id"; return $join; } function atom_search_groupby($groupby){ global $wpdb; // we need to group on post ID $groupby_id = "{$wpdb->posts}.ID"; if(!is_search() || strpos($groupby, $groupby_id) !== false) return $groupby; // groupby was empty, use ours if(!strlen(trim($groupby))) return $groupby_id; // wasn't empty, append ours return $groupby.", ".$groupby_id; } add_filter('posts_where','atom_search_where'); add_filter('posts_join', 'atom_search_join'); add_filter('posts_groupby', 'atom_search_groupby');
It's based on the Tag-Search plugin: http://projects.jesseheap.com/all-projects/wordpress-plugin-tag-search-in-wordpress-23
-
Dasistgroßartig - wie kann dieser Codegeändert werden,umein Array von Taxonomie-IDs von der Suche auszuschließen?This is great-- how can this code be modified to exclude an array of taxonomy IDs from the search?
- 1
- 2012-01-06
- HandiworkNYC.com
-
Esist zubeachten,dass die Filterrückrufefür diese Hooks * 2 * -Argumente akzeptieren.Die zweite Instanzfür alleist die _WP_Query_-Instanz,die als Referenz übergeben wird.Alle Überprüfungen auf `is_search ()` oder andere _WP_Query_-Methodenaufrufe (`is_search ()` `is_home ()` usw.) solltenimmer direkt auf der Abfrageinstanz aufgerufen werden (z. B. `$ query->is_search ()` unter der Annahme vonDer Name der Instanzvariablen lautet "$ query"in der Rückrufsignatur undnicht die Vorlagenfunktion,die sichimmer auf die Hauptabfragebezieht,nicht auf die Abfrage,für die der Filter ausgeführt wird.It should be noted that the filter callbacks for these hooks accept *2* arguments; the 2nd for all of them being the _WP_Query_ instance which is passed by reference. Any checks for `is_search()` or other _WP_Query_ method calls (`is_search()` `is_home()` etc.) should always be called directly on the query instance (eg. `$query->is_search()` assuming the name of the instance variable is `$query` in the callback signature) rather than the template function which will always refer to the main query, not the query that the filter is running for.
- 0
- 2014-06-07
- Evan Mattson
-
Wahrscheinlich auch keinegute Idee,die rohe öffentlich verfügbare Suchzeichenfolge direktin eine SQL-Abfrageeinzufügen ... [empfohlene Lektüre] (http://codex.wordpress.org/Class_Reference/wpdb#Protect_Queries_Against_SQL_Injection_Attacks)Also, probably not a good idea to inject the raw publicly available search string directly into an SQL query... [recommended reading](http://codex.wordpress.org/Class_Reference/wpdb#Protect_Queries_Against_SQL_Injection_Attacks)
- 6
- 2014-06-07
- Evan Mattson
-
Ichmöchtenur hinzufügen,dass dieseinen Konfliktmit WPML hat,da WPMLbereits 'T'im Join-Teil verwendet,sodass die Verwendung vonbenutzerdefinierten Elementen anstelle vontr,tt undt dieses ProblembehebtI would just like to add that this has a conflict with WPML because WPML alredy uses 'T' in join part, so using something custom instead of tr, tt and t fixes this problem
- 0
- 2016-02-09
- Bobz
-
@EvanMattson - Sie haben oben kommentiert,dasses "wahrscheinlich keinegute Ideeist,die rohe öffentlich verfügbare Suchzeichenfolge direktin eine SQL-Abfrageeinzufügen".Wie würdeman dieses Risikonegieren?Ich habe den von Ihnen angegebenen Linkgelesen,konnte abernicht sehen,wie dieser auf die ursprüngliche Antwort verweist.Vielen Dank Em.@EvanMattson — you commented above that it's "probably not a good idea to inject the raw publicly available search string directly into an SQL query." How would go about negating that risk? I read the link you provided but couldn't see how that links to the original answer. Many thanks Em.
- 1
- 2020-04-05
- The Chewy
-
@TheChewy Die obige Antwort zeigt "get_search_query ()",das direktin der MySQL-Anweisung der WHERE-Klausel verwendet wird.Dieser Codeist anfälligfür SQL-Injection-Angriffe,bei denenjederbeliebige SQL-Abfragen auf Ihrer Site ausführen kann,indemer sie über das Suchfeld weiterleitet.Natürlichfunktioniert die Suchebis zueinem gewissen Grad so,aber der wichtige Punktist,dass diese Eingabe ordnungsgemäß vorbereitet werdenmuss,um sicherzustellen,dass sie als Suchbegriffe undnicht als SQL-Anweisungeninterpretiert wird.Dafürist die Methode "$ wpdb->prepare ()" vorgesehen,diein derempfohlenen Lektürebeschrieben wird@TheChewy the answer above shows `get_search_query()` used directly in the MySQL statement of the WHERE clause. This code is vulnerable to SQL injection attacks, where anyone can execute arbitrary SQL queries on your site by passing them through the search field. Obviously that's how searches work to some degree, but the important point is that this input needs to be prepared properly to ensure it is interpreted as search terms and not SQL statements. This is what the `$wpdb->prepare()` method is for which is described in said recommended reading
- 0
- 2020-04-19
- Evan Mattson
-
@TheChewyfinden Sie aucheinige gute Beispielein den Dokumentenfür `wpdb ::prepare ()` hier: https://developer.wordpress.org/reference/classes/wpdb/prepare/@TheChewy you can also find some good examples in the docs for `wpdb::prepare()` here: https://developer.wordpress.org/reference/classes/wpdb/prepare/
- 0
- 2020-04-19
- Evan Mattson
-
@EvanMattson Hallo Evan,dankefür die Eingabe.Ichbin neuin PHP undbenutzerdefiniertem WP-Code und dasistmir so weit über den Kopfgegangen.Könnten Sie den Codemit dem hinzugefügten `$ wpdb->prepare ()` duplizieren,wennesnicht zu schwerist?Ich denke,es wird Wochen dauern,bisich soetwasfast verstehe.@EvanMattson Hi Evan, thanks for the input. I'm new to both php and custom WP code and that has gone so far over my head. Would you be able to duplicate the code with the `$wpdb->prepare()` added if it isn't too hard? I think it'll be weeks before I get close to understanding that sort of thing.
- 1
- 2020-04-21
- The Chewy
-
- 2010-10-07
Ist dies die Standard-WordPress-Suche?Weil das keine Taxonomienenthält (nichteinmal)Standard,wie Kategorien und Tags)in der Suche.Der Code suchtin
post_title
undpost_content
. Wenn Siejedochnochetwas hinzufügenmöchten,sollten Sie sichin den Filterposts_search
einbinden.Is this the standard WordPress search? Because that doesn't seem to include taxonomies (not even standard, like categories and tags) in the search. The code searches in
post_title
andpost_content
, but if you want to include anything else you should hook into theposts_search
filter. -
- 2013-09-08
Ich habe die Lösung von Onetrickpony über https://wordpress.stackexchange.com/a/5404/37612,wasgroßartigist,aberich habe dortein Problemgefunden,dasbei mirnichtfunktioniert hat,undich würdeeine kleine Änderung vornehmen:
- Wennichim Titel der Taxonomienacheiner Zeichenfolgegesucht habe,funktioniert das hervorragend
-
wenn die Taxonomie Sonderzeichen hat,z.mit deutschen "Umlauten" (ö,ä,ü) undman suchtnach oe,ae,ueinsteda der Verwendung des Sonderzeichens - Siemüssen die Suchein den Slug der Taxonomieeinfügen -
OR t.slug LIKE '%".get_search_query()."%'
-
Wenn Sienacheiner Kombination auseiner Suchabfrage undeinem Taxonomiefilter suchen,funktioniert dies aucheinwandfrei
-
Das Problemistjedoch,wenn Sie versuchen,nur den Taxonomiefilter zu verwenden - der Suchhaken hängteine leere Zeichenfolge an die Abfrage an,wenn kein Textgesucht wird,und aus diesem Grunderhalten Sie ALLE Beiträgeim Ergebnis. stattnur der aus dergefilterten Taxonomie. Eineeinfache IF-Anweisung löst das Problem. Dergesamtemodifizierte Code wäre also dieser (funktioniertfürmicheinwandfrei!)
Funktion custom_search_where ($ where) { global $ wpdb; if (is_search () &&get_search_query ()) $ where.="OR ((t.name LIKE '%".get_search_query (). "%' ORt.slug LIKE '%".get_search_query (). "%') AND {$ wpdb->posts} .post_status='veröffentlichen') "; return $ where; }} Funktion custom_search_join ($join) { global $ wpdb; if (is_search () &&get_search_query ()) $join.="LEFT JOIN {$ wpdb->term_relationships}tr ON {$ wpdb->posts} .ID=tr.object_id INNER JOIN {$ wpdb->term_taxonomy}tt ONtt.term_taxonomy_id=tr.term_taxonomy_id INNER JOIN { $ wpdb-> Terms}t ONt.term_id=tt.term_id "; return $join; }} Funktion custom_search_groupby ($groupby) { global $ wpdb; //Wirmüssen die Post-IDgruppieren $groupby_id="{$ wpdb->posts} .ID"; if (!is_search ()|| strpos ($groupby,$groupby_id)!==false||!get_search_query ()) return $groupby; //groupby war leer,benutze unsere if (! strlen (trim ($groupby)))gibt $groupby_id zurück; //warnicht leer,füge unsere hinzu return $groupby. ",". $groupby_id; }} add_filter ('posts_where','custom_search_where'); add_filter ('posts_join','custom_search_join'); add_filter ('posts_groupby','custom_search_groupby');
I tried the solution of Onetrickpony above https://wordpress.stackexchange.com/a/5404/37612, which is great, but I found one issue there, which did not work for me, and I would make one small modification:
- if I searched for a string in the title of the taxonomy - it works great
if the taxonomy has special characters e.g. with german "Umlauts" (ö,ä,ü) and one searches for oe, ae, ue insteda of using the special char - you need to add the search in the slug of the taxonomy -
OR t.slug LIKE '%".get_search_query()."%'
if you search for a combination of a search query and a taxonomy filter - this also works fine
But the problem is, when you try to use only the taxonomy filter - the search hook append an empty string to the query if no text is searched for, and for that reason you get ALL posts in the result, instead of only those from the filtered taxonomy. A simple IF statement solves the problem. So the whole modified code would be this (works perfectly fine for me!)
function custom_search_where($where){ global $wpdb; if (is_search() && get_search_query()) $where .= "OR ((t.name LIKE '%".get_search_query()."%' OR t.slug LIKE '%".get_search_query()."%') AND {$wpdb->posts}.post_status = 'publish')"; return $where; } function custom_search_join($join){ global $wpdb; if (is_search()&& get_search_query()) $join .= "LEFT JOIN {$wpdb->term_relationships} tr ON {$wpdb->posts}.ID = tr.object_id INNER JOIN {$wpdb->term_taxonomy} tt ON tt.term_taxonomy_id=tr.term_taxonomy_id INNER JOIN {$wpdb->terms} t ON t.term_id = tt.term_id"; return $join; } function custom_search_groupby($groupby){ global $wpdb; // we need to group on post ID $groupby_id = "{$wpdb->posts}.ID"; if(!is_search() || strpos($groupby, $groupby_id) !== false || !get_search_query()) return $groupby; // groupby was empty, use ours if(!strlen(trim($groupby))) return $groupby_id; // wasn't empty, append ours return $groupby.", ".$groupby_id; } add_filter('posts_where','custom_search_where'); add_filter('posts_join', 'custom_search_join'); add_filter('posts_groupby', 'custom_search_groupby');
-
- 2010-11-06
Ich habe dengleichen Informationsstand wie Jan. Ich weiß,dassesmöglichist,die Suche auchmit Plugins zuerweitern.
Wahrscheinlichist Alles suchen (Wordpress Plugin) das,wonach Sie suchen.Gemäß der Funktionsliste werdenjetztbenutzerdefinierte Taxonomien unterstützt.
I have the same level of information like Jan. I know it's possible to extend search with plugins as well.
Probably Search Everything (Wordpress Plugin) is what you are looking for. According to the feature list, it now supports custom taxonomies.
-
+1 Für Search Everything Plugin.Esfunktioniert wieerwartet und liefertmehr Ergebnisse als die Standard-Wordpress-Suche.+1 For Search Everything plugin. It works as expected and returns more results than standard Wordpress search.
- 0
- 2010-12-02
- PNMG
-
- 2012-12-08
Ich habe dasgleiche Problemmit dem WooCommerce-Warenkorb-Plugin. Meine Suchergebnisseenthaltennicht denbenutzerdefinierten Taxonomiebegriff "product_tag",daes sichnicht umein Standard-Post-Tag handelt.In diesem anderen StackOverflow-Thread habeicheine Lösung zu diesem Themagefunden:
Das Codebeispiel von tkelly hatbei mirfunktioniert,alsin seinem Beispiel der Begriff
author
ersetzt wurdemitproduct_tag
gemäß unseren Anforderungenfür die Cart-Plugins.I have the same problem going on with the WooCommerce cart plugin.. My search results are not including the custom taxonomy term, 'product_tag', because it not a standard post tag. I found a solution in this other StackOverflow thread about the matter:
The code example by tkelly worked for me when replacing the term
author
in his example withproduct_tag
as per our needs for the cart plugins. -
- 2015-11-12
Ichfand die Antwort von onetrickponygroßartig,aber siebehandeltjede Suche alseinen einzelnen Begriff undbehandelt auch keinen Suchbegriff,derin Anführungszeicheneingeschlossenist. Ich habe seinen Code (insbesondere die Funktion
atom_search_where
)ein weniggeändert,um diesebeiden Situationen zubewältigen. Hieristmeine modifizierte Version seines Codes:// search all taxonomies, based on: http://projects.jesseheap.com/all-projects/wordpress-plugin-tag-search-in-wordpress-23 function atom_search_where($where){ global $wpdb, $wp_query; if (is_search()) { $search_terms = get_query_var( 'search_terms' ); $where .= " OR ("; $i = 0; foreach ($search_terms as $search_term) { $i++; if ($i>1) $where .= " AND"; // --- make this OR if you prefer not requiring all search terms to match taxonomies $where .= " (t.name LIKE '%".$search_term."%')"; } $where .= " AND {$wpdb->posts}.post_status = 'publish')"; } return $where; } function atom_search_join($join){ global $wpdb; if (is_search()) $join .= "LEFT JOIN {$wpdb->term_relationships} tr ON {$wpdb->posts}.ID = tr.object_id INNER JOIN {$wpdb->term_taxonomy} tt ON tt.term_taxonomy_id=tr.term_taxonomy_id INNER JOIN {$wpdb->terms} t ON t.term_id = tt.term_id"; return $join; } function atom_search_groupby($groupby){ global $wpdb; // we need to group on post ID $groupby_id = "{$wpdb->posts}.ID"; if(!is_search() || strpos($groupby, $groupby_id) !== false) return $groupby; // groupby was empty, use ours if(!strlen(trim($groupby))) return $groupby_id; // wasn't empty, append ours return $groupby.", ".$groupby_id; } add_filter('posts_where','atom_search_where'); add_filter('posts_join', 'atom_search_join'); add_filter('posts_groupby', 'atom_search_groupby');
I found the answer from onetrickpony to be great but it treats any search as a single term and also won't deal with a search phrase enclosed with quotation marks. I modified his code (specifically, the
atom_search_where
function) a bit to deal with these two situations. Here is my modified version of his code:// search all taxonomies, based on: http://projects.jesseheap.com/all-projects/wordpress-plugin-tag-search-in-wordpress-23 function atom_search_where($where){ global $wpdb, $wp_query; if (is_search()) { $search_terms = get_query_var( 'search_terms' ); $where .= " OR ("; $i = 0; foreach ($search_terms as $search_term) { $i++; if ($i>1) $where .= " AND"; // --- make this OR if you prefer not requiring all search terms to match taxonomies $where .= " (t.name LIKE '%".$search_term."%')"; } $where .= " AND {$wpdb->posts}.post_status = 'publish')"; } return $where; } function atom_search_join($join){ global $wpdb; if (is_search()) $join .= "LEFT JOIN {$wpdb->term_relationships} tr ON {$wpdb->posts}.ID = tr.object_id INNER JOIN {$wpdb->term_taxonomy} tt ON tt.term_taxonomy_id=tr.term_taxonomy_id INNER JOIN {$wpdb->terms} t ON t.term_id = tt.term_id"; return $join; } function atom_search_groupby($groupby){ global $wpdb; // we need to group on post ID $groupby_id = "{$wpdb->posts}.ID"; if(!is_search() || strpos($groupby, $groupby_id) !== false) return $groupby; // groupby was empty, use ours if(!strlen(trim($groupby))) return $groupby_id; // wasn't empty, append ours return $groupby.", ".$groupby_id; } add_filter('posts_where','atom_search_where'); add_filter('posts_join', 'atom_search_join'); add_filter('posts_groupby', 'atom_search_groupby');
Ich habe zweibenutzerdefinierte Taxonomien,die auf zweibenutzerdefinierte Beitragstypen angewendet werden.Die Begriffslistein der Seitenleisteistin Ordnung und listet alle damit verbundenen Beiträge auf.Wenn Siejedochnacheinem bestimmten Begriff suchen,wird kein Beitragmit diesem Begriff angezeigt.
Beispiel: http://dev.andrewnorcross.com/das/all-case-studies/ Suchen Sienach dem Begriff "PQRI"
Ichbekommenichts.Irgendwelche Ideen?Ich habe versucht,verschiedene Such-Plugins zu verwenden,aber diesebrechenentwedermeine benutzerdefinierten Suchparameter oderfunktioniereneinfachnicht.