MDTF
Facettensuche für WordPress-Beiträge und benutzerdefinierte Post-Types nach Post-Meta-Feldern und Taxonomien gleichzeitig.
- Erstveröffentlichung
- Aktive Installationen
- 1.000+
- Bewertung
- Rezensionen lesen
Über mich
MDTF filtert jeden Post-Type gleichzeitig nach Meta-Feldern und Taxonomien. Es wurde für Kataloge gebaut, die keine Shops sind: Immobilien, Autohändler, Verzeichnisse. Der Website-Inhaber definiert Filterfelder in einem eingebauten Konstruktor (Checkbox, Dropdown, Bereichsschieberegler, Bereichs-Dropdown, Kalender, Texteingabe, Label), füllt sie pro Beitrag aus und platziert Suchformulare als Widgets oder Shortcodes.
Das Schwierige ist, dass WordPress Meta als untypisierte Strings in wp_postmeta speichert. Jede Bereichs-, Datums- und Textbedingung muss in eine meta_query verwandelt werden, die korrekt vergleicht, jede sichtbare Option braucht eine Live-Zahl unter der aktuellen Suche, und AND/OR zwischen Gruppen darf die Bedingungen, die Beiträge ausblenden, nie abschwächen.
Das Plugin wird seit 2014 gepflegt, durch PHP 7.x und 8.x, die Änderungen der Speicherung in WooCommerce 3.0, den Block-Widgets-Editor und eine lange Reihe von Sicherheitsmeldungen, die über Patchstack und Wordfence bearbeitet wurden. Der Premium- und der kostenlose Zweig teilen sich dieselbe Codebasis.
MDTF · Metadaten-Filter
was gelöst wurde
Suchzustand und Links
shipped · 2014Was es bringtLinks zu Suchergebnissen bleiben kurz und lassen sich als Lesezeichen speichern oder teilen. Wiederholte gleiche Suchen verwenden einen Link, statt gespeicherte Kopien anzuhäufen.
- Problem
- Eine Suche über viele Meta-Felder und Taxonomien ist eine große verschachtelte Struktur. In GET-Parametern mitgeführt, ergibt sie sehr lange Links und legt die Form der Abfrage offen, und jede Abfrage der Seite (Ergebnisse, Zähler, Paginierung, Sortierung, AJAX-Neuzählung) muss denselben Zustand lesen.
- Lösung
Der Formularzustand wird als JSON kodiert, auf dem Server in einem Transient oder einer PHP-Session gespeichert, und der Link trägt nur einen kurzen Schlüssel. Ein Accessor dekodiert und validiert ihn für alle Abfragen des Requests.
- Stack
Der Suchzustand ist zu groß, um in der URL transportiert zu werdenBase64-JSON auf dem Server speichern, nur einen kurzen Schlüssel page_mdf in den Link legen
encode_search_get_params() erhält das serialisierte Formular per AJAX, parst und bereinigt es, entfernt '~'-Werte (beliebig) und speichert den Rest mit set_page_mdf_session() als Base64-JSON. Je nach Einstellung keep_search_data_in gehen die Daten einen Tag lang in einen Transient oder nach $_SESSION. Die Antwort ist mdf_cat=...&page_mdf=<key>, woraus das Frontend den Ergebnislink macht.
Dieselbe Suche erzeugte jedes Mal eine neue gespeicherte KopieDer Schlüssel ist md5 des normalisierten JSON: assoziative Schlüssel sortiert, Skalare getrimmt, Listen in Reihenfolge belassen
get_search_data_key() hasht die Ausgabe von normalize_search_data(), das das Array rekursiv durchläuft, assoziative Schlüssel sortiert und die Reihenfolge von Listen beibehält. Die Feldreihenfolge aus dem Browser spielt keine Rolle mehr, sodass eine Suche auf einen Transient und einen Link abgebildet wird. Links mit älteren Schlüsseln funktionieren weiter, solange ihr Transient lebt.
Ein öffentlicher Endpunkt speichert jede Suche einen Tag langNicht-String- oder zu große Eingaben (per Filter änderbar, 65536 Bytes) ablehnen, bevor etwas gespeichert wird
mdf_encode_search_get_params ist für nicht angemeldete Besucher registriert, und jede verschiedene Suche schreibt einen Transient, der einen Tag lebt. Der Handler prüft, dass vars ein String innerhalb von mdf_search_data_max_length ist, und antwortet andernfalls mit mdf_cat=-1, ohne zu speichern. Ein übergebener Schlüssel wird nur akzeptiert, wenn er auf /^[0-9a-f]{32}$/ passt, sonst wird der Schlüssel aus den Daten abgeleitet.
Gespeicherter Zustand ist beim Zurücklesen nicht vertrauenswürdigIn ein Array oder in nichts dekodieren; die Bereichsgrenzen from/to zu Zahlen erzwingen
get_page_mdf_data() behandelt alles, was nicht zu einem Array dekodiert, als keine Suche. Es führt die Standard-Widget-Optionen zusammen und wandelt für jedes Feld medafi_ 'from' und 'to' in Zahlen um, sodass Bereichs- und Kalenderwerte als Zahlen in meta_query ankommen, was immer der Besucher gesendet hat. Das dekodierte Ergebnis wird für den Rest des Requests in einer statischen Variable gehalten.
Feste Suchen brauchen dauerhafte Links, die nie ablaufenEin numerischer Schlüssel wird statt zu einem Transient zum Post-Meta page_mdf_string aufgelöst
Konstante Links sind ein separater versteckter Post-Type. Sein save_post() speichert die kodierte Suche in page_mdf_string. get_page_mdf_session() prüft den Schlüssel: numerisch bedeutet eine Post-ID und liest das gespeicherte Meta, alles andere geht an den Transient- oder Session-Speicher. Ergebnisse, Zähler und Templates müssen nicht wissen, welche Art von Link verwendet wurde.
Aufbau der Meta-Abfrage
shipped · 2014Was es bringtBesucher können nach Preis, Jahr, Laufleistung, Daten oder Wörtern suchen, einschließlich offener Bereiche wie 'und mehr', und Filter können bereits an Beiträgen eingegebene Daten wiederverwenden.
- Problem
- Meta-Werte sind Strings in wp_postmeta. Preise, Jahre, Laufleistung, Datumsbereiche und Freitext müssen zu meta_query-Klauseln werden, die als Zahlen oder Daten vergleichen, offene Bereiche unterstützen und sich dennoch von MySQL ausführen lassen.
- Lösung
Jeder Typ eines Filterelements hat seine eigene Übersetzung in meta_query oder in ein posts_where-Fragment, mit DECIMAL-Vergleichen für Schieberegler und Bereichs-Dropdowns, offenen Obergrenzen und Bereichsmodellen mit zwei Schlüsseln, die pro Beitrag gespeichert werden.
- Stack
Ein Schieberegler am Maximum muss 'und mehr' bedeuten, nicht 'bis Max'Die Obergrenze durch 2147483647 ersetzen, wenn der Regler am konfigurierten Maximum steht
In get_meta_query_array() vergleicht der Schieberegler-Fall das gewählte 'to' mit dem eigenen Maximum des Reglers; sind sie gleich, wird die obere Grenze zu MetaDataFilterCore::$max_int, sodass Beiträge mit Werten oberhalb der konfigurierten Skala weiter passen. Bereichs-Dropdowns nutzen dieselbe Idee mit einem Suffix 'i' (Unendlich) wie '1001-i'. Einzelne Schieberegler und Bereichs-Dropdowns verwenden BETWEEN mit dem Typ DECIMAL.
Ein Element hat einen Wertebereich, der Besucher sucht nach einer ZahlSchieberegler mit Doppelwert: key <= v AND key_to >= v über zwei Meta-Felder
Bei Schiebereglern mit slider_range_value = 1 speichert ein Beitrag zwei Werte, den Feldschlüssel und key_to (zum Beispiel eine Preis- oder Größenspanne). Der Besucher wählt einen Wert, und die Abfrage verlangt, dass er innerhalb der eigenen Spanne des Beitrags liegt, beide Seiten als DECIMAL typisiert.
Datumsbereiche, bei denen jedes Ende des Kalenders leer sein darfVier Zweige auf den Schlüsseln _from/_to: offener Start, offenes Ende, einzelner Tag, BETWEEN
Das Kalenderelement speichert <key>_from und <key>_to. Nur 'to' gesetzt ergibt _to <= to; nur 'from' ergibt _from >= from; gleiche Werte treffen Elemente, deren Spanne diesen Tag abdeckt; eine echte Spanne wird zu BETWEEN auf _from. Ein Code-Kommentar datiert den letzten Zweig auf 08-10-2014.
Texteingabe, die Titel oder Inhalt Wort für Wort durchsuchtposts_where fügt per Wort LIKE über $wpdb->prepare und esc_like hinzu, durch einen Filter verbunden
Ein Textelement kann auf seinen eigenen Meta-Wert oder auf post_title, post_content oder beide mit OR oder AND zielen. Für die Post-Spalten wird die Bedingung an MDTF_HELPER-Filter auf posts_where übergeben, die die Phrase in Wörter zerlegen (umschaltbar mit mdf_txtsearch_some_words_behavior) und sie mit mdf_txtsearch_some_words_condition verbinden, standardmäßig AND. Mehrfache Leerzeichen werden zuvor zusammengefasst.
Filterfelder müssen Meta wiederverwenden, das auf der Website bereits existiertReflected Items ordnen einen Filterschlüssel zur Abfragezeit einem vorhandenen Meta-Schlüssel zu
Ein als is_reflected markiertes Feld trägt reflected_key. Der Query-Builder, der OR-Splitter und die öffentliche API get_field() verwenden alle den reflected key, sodass ein Filter auf Meta arbeiten kann, das vom Theme oder einem anderen Plugin geschrieben wurde, ohne Werte in medafi_-Schlüssel zu kopieren.
AND/OR-Logik zwischen Filtergruppen
im ProduktWas es bringtBesucher können wählen, ob Ergebnisse zu irgendeiner oder zu allen angehakten Optionen passen. Versteckte, ausverkaufte oder unzugehörige Elemente bleiben dennoch aus den Ergebnissen heraus.
- Problem
- Besucher wollen vielleicht OR zwischen angehakten Optionen, aber ein einfaches OR an der Spitze von meta_query verknüpft auch die Servicebedingungen per OR: Filterkategorie, versteckte Beiträge, WooCommerce-Sichtbarkeit und Lagerbestand. Versteckte und fremde Beiträge gelangen dann in die Ergebnisse. Der gewählte Modus muss außerdem jede Abfrage einer Suche erreichen.
- Lösung
Bedingungen werden in Besucherbedingungen, die per OR verknüpft werden dürfen, und erforderliche aufgeteilt. Die endgültige Abfrage ist AND auf oberster Ebene mit einer verschachtelten OR-Gruppe, für Meta und für Taxonomien. Der Modus reist im gespeicherten Suchzustand mit.
- Stack
Ein einfaches OR würde auch die Bedingungen, die Beiträge ausblenden, per OR verknüpfenwrap_meta_query(): AND oben, Besucher-OR-Gruppe verschachtelt, Servicebedingungen erforderlich
wrap_meta_query() baut relation AND und verschachtelt die per OR verknüpfbaren Bedingungen als eine Gruppe relation OR, nur wenn es zwei oder mehr sind. mdf_hide_post NOT EXISTS, meta_data_filter_cat, _visibility und _stock_status stehen auf oberster Ebene und gelten immer. Derselbe Wrapper wird von der Ergebnisabfrage und von den Zählern verwendet.
Nur Checkbox- und Label-Bedingungen ergeben unter OR einen Sinnsplit_meta_query_array() typisiert jede Klausel nach ihrem Filterelement; Schieberegler bleiben erforderlich
Der Splitter ordnet jeden Suchschlüssel (eigen oder reflected) dem Typ seines Elements aus den Filterabschnitten der Suche zu. Klauseln von Checkbox- und Label-Elementen werden per OR verknüpfbar; Schieberegler, Dropdowns, Texteingaben, Kalender und Bereichs-Dropdowns bleiben erforderlich. Im AND-Modus wird das Array unverändert zurückgegeben, sodass bestehende AND-Suchen dasselbe SQL erzeugen wie zuvor.
Taxonomie-OR darf Sichtbarkeit und zusätzliche Taxonomien nicht verwerfensplit_tax_query_array() trennt Besucher-Terme von durch Filter hinzugefügten per Identität
Nachdem Filter von Drittanbietern (mdf_filter_taxonomies, zusätzliche Taxonomien, product_visibility) die tax_query verändert haben, vergleicht der Splitter jede Klausel mit der aus dem Formular aufgebauten Liste mit striktem array_search. Treffer sind Besucherbedingungen, der Rest ist erforderlich. Wiederholte Besucherklauseln, die der Filter pro Request gesammelt hat, werden verworfen. wrap_tax_query() verschachtelt danach nur den Besucheranteil unter OR.
Der AND/OR-Modus muss Neuzählung, Paginierung und Sortierung erreichenDen Modus in den Widget-Optionen page_mdf speichern, den Request nur als Fallback verwenden
encode_search_get_params() schreibt meta_data_filter_bool und mdf_tax_bool in mdf_widget_options der gespeicherten Suche und übernimmt die Wahl des Besuchers, wenn das Widget beides erlaubt. get_meta_data_filter_bool() und get_mdf_tax_bool() lesen zuerst den gespeicherten Wert und normalisieren alles, was nicht 'OR' ist, zu 'AND'. Ergebnisse, Zähler, AJAX-Neuzählung, Paginierung und Sortierung lesen denselben Zustand.
Das Aktivieren von Taxonomie-OR darf die Ergebnisse von Widgets auf Live-Websites nicht verändernTaxonomie-OR nur für Widgets anwenden, die mit einem Versions-Flag gespeichert wurden; ältere bleiben AND
Von älteren Versionen gespeicherte Widgets haben Taxonomien immer mit AND durchsucht, was immer ihre OR-Option sagte. Die Option auf sie anzuwenden würde Ergebnisse auf Live-Websites ohne jede Handlung des Inhabers verändern. get_widget_tax_bool() beachtet die Option nur, wenn taxonomies_options_behaviour_ver gesetzt ist, was geschieht, wenn das Widget von der neuen Version gespeichert wird.
Ein angehakter Elternterm und sein angehaktes Kind: der Elternterm würde alles darunter treffenEinen angehakten Term verwerfen, wenn eines seiner Kinder ebenfalls angehakt ist
tax_query schließt Kinder standardmäßig ein, daher würde ein angehakter Elternterm jeden Beitrag darunter treffen und die Auswahl des Kindes bedeutungslos machen. get_tax_query_array() entfernt einen angehakten Term, wenn get_term_children() von ihm die angehakte Menge schneidet, und indiziert die Liste dann neu.
Dynamische Zähler und Caching
shipped · 2014Was es bringtJede Option zeigt, wie viele Elemente sie liefern würde, sodass Besucher leere Ergebnisse vermeiden. Die Zahlen werden zwischengespeichert, daher bleibt die Website schnell.
- Problem
- Jede Checkbox, jede Dropdown-Option und jeder Term zeigt, wie viele Beiträge sie bei der aktuellen Suche liefern würde. Das ist eine Abfrage pro sichtbarem Element, mit Joins auf wp_postmeta, bei jedem Seitenaufruf und jeder AJAX-Neuzählung.
- Lösung
Zählabfragen holen nur IDs und überspringen Found-Rows und Cache-Priming. Zahlen können in einer Key/Value-Tabelle mit einem Hash der Abfrage als Schlüssel zwischengespeichert werden, Term-Bäume in Transients mit festgelegter Lebensdauer.
- Stack
Eine Zahl muss die Suche plus diese eine Option zeigenPro Element: seine Klausel hinzufügen, den Geschwisterwert desselben Selects ersetzen, erneut ausführen
get_item_posts_count() beginnt bei der aktuellen Suche. Eine Checkbox fügt key = 1 hinzu, sofern es nicht schon da ist. Eine Dropdown-Option entfernt zuerst die Klausel desselben Schlüssels, weil Geschwisteroptionen sich ausschließen, und fügt dann sich selbst hinzu (bei Bereichsoptionen als BETWEEN). Für Terme fügt get_tax_count() den Term in eine Kopie des Taxonomie-Zustands ein, mit abgeschaltetem Tax-Cache pro Request, und stellt danach wieder her.
Zählabfragen bezahlten für Daten, die sie nie nutztenfields=ids, nopaging, kein Priming von Meta-/Term-Cache, set_found_posts() überschrieben
Zählabfragen verlangen nur IDs, mit ausgeschalteten update_post_meta_cache, update_post_term_cache und cache_results. WP_QueryMDFCounterIn erweitert WP_Query und überschreibt set_found_posts() mit nichts, sodass WordPress den zusätzlichen Found-Rows-Schritt nicht ausführt; post_count ist die Antwort.
Dieselben Zahlen werden bei jedem Seitenaufruf neu berechnetZahlen in {prefix}mdf_query_cache zwischenspeichern, mit md5 der Abfrageargumente als Schlüssel
WP_QueryMDFCounter hasht das vollständige Argument-Array und sucht es in einer Tabelle mit zwei Spalten und einem Index auf mkey; bei einem Fehltreffer führt es die Abfrage aus und fügt die Zahl ein. Die Einstellungsseite legt die Tabelle an und schaltet die Option mit der angezeigten CREATE-Anweisung aus, falls dem Datenbankbenutzer das Recht fehlt. Ein Admin leert den Cache über die Einstellungsseite, die hinter manage_options und einem Nonce ein TRUNCATE ausführt.
Hierarchische Term-Listen kosten eine Abfrage pro EbeneEin get_categories()-Aufruf pro Taxonomie, Baum in PHP aufgebaut, als Transient zwischengespeichert
get_terms() lädt alle Terme der Taxonomie einmal, und assemble_terms_childs() baut die Kind-Listen aus diesem Array. Bei aktivem cache_terms_data wird das Ergebnis als Transient unter mdf_terms_cache_<md5 der Argumente> gespeichert, dessen Lebensdauer aus der Einstellung für den Zeitraum des Term-Caches stammt (stündlich bis 7 Tage; kein Ablauf, wenn kein Zeitraum gesetzt ist).
Der Filter soll nicht auf Seiten laden, die keine Suche habenOptionale URL-Allowlist: Frontend-Initialisierung überspringen, wenn der Pfad nicht aufgeführt ist
is_should_init() läuft, bevor das Plugin seine Post-Types und Hooks registriert. Ist init_on_pages_only gesetzt, normalisiert es die aktuelle URL (Query-String und /page/N entfernt) und kehrt früh zurück, wenn die URL nicht in der Liste steht. Admin-Requests initialisieren immer.
Datenmodell und WordPress-Integration
shipped · 2014Was es bringtErgebnisse erscheinen im bestehenden Design der Website, und Mitarbeiter können Filterfelder umbenennen oder neu ordnen, ohne bereits an Beiträgen gespeicherte Daten zu verlieren.
- Problem
- Filterfelder werden vom Website-Inhaber definiert, ihre Werte liegen im Post-Meta beliebiger Post-Types, und Ergebnisse müssen in den eigenen Templates des Themes erscheinen, ohne das Theme zu ändern.
- Lösung
Felddefinitionen liegen in einem versteckten Post-Type. Beitragswerte werden doppelt gespeichert, als ein Array zum Bearbeiten und als einzelne Meta-Schlüssel zum Abfragen. Die Hauptabfrage wird aus pre_get_posts mit einem Re-Entrancy-Guard ersetzt.
- Stack
Meta-Werte müssen als Menge bearbeitbar und einzeln abfragbar seinDie Menge als ein Array speichern und jedes Feld medafi_ als eigenen Meta-Schlüssel
save_post() schreibt page_meta_data_filter als einzelnes Array, das der Bearbeitungsbildschirm zurückliest, und schreibt dann jedes Feld medafi_ mit update_post_meta(), das meta_query verwenden kann. Filterabschnitte und ihre Elemente werden als Meta html_items des versteckten Post-Types meta_data_filter gespeichert.
Das Ändern der Filterkategorie eines Beitrags darf keine veralteten Werte zurücklassenBei Kategoriewechsel alle medafi_-Meta des Beitrags löschen, bevor neue gespeichert werden
Felder der alten Filterkategorie würden sonst in wp_postmeta bleiben und Suchen dieser Kategorie treffen. save_post() vergleicht die gesendete Kategorie mit der gespeicherten und entfernt alle Zeilen medafi_% des Beitrags, wenn sie sich geändert hat.
Das Umbenennen eines Feldschlüssels darf keine Daten in Beiträgen verwaisen lassenEindeutigkeit über alle Filterabschnitte prüfen, dann in postmeta mit einem UPDATE umbenennen
change_meta_key() verlangt das Präfix medafi_, lehnt einen Schlüssel ab, der in diesem oder einem anderen Filterabschnitt bereits verwendet wird, und nennt den kollidierenden Abschnitt. Danach benennt es den Schlüssel in html_items um, schreibt die page_meta_data_filter-Arrays der betroffenen Beiträge neu und führt UPDATE postmeta SET meta_key aus. Es braucht einen Nonce, edit_post und edit_others_posts, weil es alle Beiträge berührt.
Ergebnisse müssen im eigenen Suchtemplate des Themes gerendert werdenpre_get_posts führt die Ergebnisabfrage aus und ersetzt das globale $wp_query, mit Schleifenschutz
parse_query() markiert die Hauptabfrage als Suche des angeforderten Post-Types. pre_get_posts() rendert [meta_data_filter_results] ohne Template; diese View deklariert global $wp_query und weist eine neue, aus der Suche gebaute WP_Query zu. Ein Request-Flag verhindert den erneuten Eintritt, weil die neue Abfrage pre_get_posts erneut auslöst. Der Filter mdtf_prohibited_post_types hält interne Abfragen von ACF und Contact Form 7 heraus.
WooCommerce 3.0 verlagerte versteckte Produkte von Meta in eine TaxonomieVersionsweiche: product_visibility NOT IN ab 3.0, davor _visibility-Meta
Ergebnisse, Element-Zähler und Term-Zähler verzweigen alle nach WOOCOMMERCE_VERSION: ab 3.0 fügen sie eine tax_query hinzu, die exclude-from-catalog ausschließt, frühere Versionen erhalten eine Meta-Klausel _visibility IN (catalog, visible). Eine optionale Klausel _stock_status blendet ausverkaufte Produkte aus. Bei aktivem WPML erhält außerdem jede Abfrage die aktuelle Sprache.
Ältere Dropdown-Optionen haben keinen Schlüssel, während Beiträge ihre Titel als Werte speichernfill_select_keys() verwendet beim Lesen den Optionstitel als Schlüssel und passt so zu gespeicherten Beitragswerten
Von älteren Versionen des Konstruktors gespeicherte Dropdown-Optionen haben einen leeren Schlüssel, während die Meta-Box des Beitrags den Optionstitel als Wert speichert. Statt einer Migration läuft fill_select_keys() in get_html_items() und beim Speichern, füllt leere Schlüssel mit dem getrimmten Titel und lässt ausdrückliche Schlüssel, auch '0', unberührt. Bestehende Beitragswerte passen, ohne dass Beiträge neu gespeichert werden müssen.
Sicherheitshärtung
im ProduktWas es bringtDie öffentliche Suche kann nicht genutzt werden, um unerwünschte Daten zu schreiben oder Admin-Aktionen zu erreichen, was die Website und ihre Inhalte schützt.
- Problem
- Das Plugin stellt öffentliche AJAX-Endpunkte bereit, rendert Templates nach Namen aus Optionen und schreibt Post-Meta aus Formularen.
- Lösung
Serverseitige Signaturen für Daten, die der Browser zurückspielt, Whitelists für Template-Pfade und Meta-Schlüssel sowie Prüfungen von Berechtigung und Nonce bei Admin-Aktionen.
- Stack
Ein Widget innerhalb eines Blocks muss per AJAX-Neuzählung aus Optionen neu gezeichnet werden, die die Seite mitführtWidget-Klasse und Optionen mit wp_hash signieren; nur zwei bekannte Widget-Klassen akzeptieren
Ein Legacy-Widget innerhalb eines Blocks hat keine Sidebar, in der die Neuzählung es per ID finden könnte, daher trägt sein Formular die Widget-Klasse und die Optionen. get_widget_redraw_data() signiert sie mit wp_hash(); get_widget_from_redraw_data() verifiziert mit hash_equals() und akzeptiert vor dem Aufruf von the_widget() nur MetaDataFilter_Search und MetaDataFilter_TaxSearch.
Der Pfad des Ergebnis-Templates stammt aus Shortcode- und Widget-OptionenJedes Pfadsegment auf [A-Za-z0-9_-] reduzieren; Unterordner erlaubt, '..' unmöglich
sanitize_template_path() normalisiert Slashes, filtert jedes Segment auf einen sicheren Zeichensatz und verwirft leere, sodass ein Wert den Template-Ordner nicht verlassen kann, während Unterordner wie any/my_posts weiter funktionieren.
Das Bearbeitungsformular eines Beitrags darf keine anderen Meta-Schlüssel als Filterfelder schreibenNur medafi_-Schlüssel akzeptieren und vor dem Speichern der Werte edit_post verlangen
save_post() entfernt jeden Schlüssel ohne das Präfix medafi_ aus dem gesendeten Array, bevor es gespeichert wird, und prüft das Präfix vor jedem Aufruf von update_post_meta() erneut, sodass das Formular weder _edit_lock noch _price oder ähnliche Schlüssel setzen kann. Das Speichern von Werten verlangt current_user_can('edit_post').
Admin-AJAX-Aktionen dürfen nicht von jedem Besucher aufrufbar seinBerechtigung plus Nonce beim Leeren des Caches, beim Umbenennen von Schlüsseln und beim Bearbeiten von Widgets
Das Leeren des Caches verlangt manage_options und mdtf_ajax_nonce. Das Umbenennen von Schlüsseln verlangt einen eigenen Nonce, edit_post und edit_others_posts. Aktionen für Widget-Felder verlangen edit_theme_options. Nicht angemeldete Besucher erreichen nur Frontend-Suchaktionen (Term-Kinder, Suchkodierung, Neuzählung, Suchpanel, Inhalt des Suchbuttons). Die anderen für sie registrierten Handler prüfen den Zugriff selbst: die Messenger-Abonnement-Aktionen verlangen Anmeldung und einen Nonce, der Statistik-Helfer verlangt manage_options.
Zahlen
wordpress.org- Aktive Installationen 1.000+ Zähler von wordpress.org.
- Rezensionen 28 Durchschnitt 4.5 von 5.
- Jahre Support 12 Seit 22. April 2014, letztes Update 13. Oktober 2026.