Bachi Anfang des Jahres: WordPress und WPML get_page_by_path update ()

Das Jahr 2012 begann mit ein paar Stunden von Tiefsee-Debugging, weil zwei (bekannte) nervt ziemlich ärgerlich. , con la globale (e famosa) omonima istanza $wpdb . Die erste, unter anderem ziemlich veraltet, im Kern von WordPress, die das Verfahren betrifft update() der Klasse wpdb , mit dem globalen (und beliebte) gleichnamigen Instanz $wpdb . Der Fehler wird angezeigt, wenn Sie ein Feld zu aktualisieren versuchen NULL . Trotz zahlreicher Beschwerden scheint die WordPress Entwicklungsteam keine Lösung für das lästige Problem zu finden. In der Tat, bis heute ist die einzige Lösung zu notieren die SQL auf seine eigenen.

Es gab eine Zeit, da dachte ich, ich hätte um das Problem arbeitete, vorbei an der Methode auch das Array mit der Liste der Typen Feld ein:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
array ( $ Values ​​= array (
'prova' , 'Name' => 'test',
null 'Date_start' => null
);

array ( $ Formate = array (
'% S',
'NULL'
);

array ( $ Where = array (
5 'Id' => 5
);

update ( 'tablename' , $values , $where , $formats ) ; $ WPDB -> update ('Tabellenname', $ values, $, wo $ Formate);

Auf diese Weise ist die SQL, das aus:

1
SET `name` = 'prova' , `date _ start` = NULL WHERE `id` = '' UPDATE `tabellenname` September `name` = 'test', Start _ `date` = NULL WHERE `id` =''

Alles perfekt, außer dass Sie verloren Ihren Zustand, wo! In der Praxis "Unordnung" mit der Formatierung 'NULL' , bricht alle übrigen. Vorbei die Formate für den Zustand, in dem:

1
2
3
4
...
array ( '%d' ) ; $ Where_formats = array ('% d');

update ( 'tablename' , $values , $where , $formats , $where_formats ) ; $ WPDB -> update ('Tabellenname', $ values, $, wo $ Formate, $ where_formats);

Sie erhalten (ich würde sagen, fast noch schlimmer):

1
SET `name` = 'prova' , `date _ start` = NULL WHERE `id` = 0 UPDATE `tabellenname` September `name` = 'test', Start _ `date` = NULL WHERE `id` = 0

Natürlich ist es klar, dass die Machthaber in diesem Spiel die Formatierung und das ist nicht 'date_start' => null . So ist die einzige mögliche Lösung ist eine Brute-Force-Angriff, dh:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17.
array ( $ Values ​​= array (
'prova' , 'Name' => 'test',
null 'Date_start' => null
);

array ( $ Formate = array (
'% S',
'% NNULL'
);

array ( $ Where = array (
5 'Id' => 5
);

array ( '%d' ) ; $ Where_formats = array ('% d');

update ( 'tablename' , $values , $where , $formats , $where_formats ) ; $ WPDB -> update ('Tabellenname', $ values, $, wo $ Formate, $ where_formats);

Was schließlich bauen die SQL wie es sein sollte:

1
SET `name` = 'prova' , `date _ start` = NULL WHERE `id` = 5 UPDATE `tabellenname` September `name` = 'test', Start _ `date` = NULL WHERE `id` = 5

Allerdings habe ich das erste zu sagen bin, '%NNULL' ist nicht nur passabel, lösen die Sackgasse aber sicher sein, das Update auf ihre eigenen zu schreiben.

WPML

Bleiben Sie auf der WordPress-Theme, bewegen wir uns jetzt Seite Plugin. WPML (WordPress Multi Language) ist ein Plugin, spezialisiert auf die Lokalisierung von WordPress, dh die Verwaltung einer mehrsprachigen Website. Eines ihrer Merkmale, aufgrund der Architektur der Lösung, dass die Entwickler angenommen haben schriftlich und Verwaltung der Post in verschiedenen Sprachen zu ermöglichen, ist zu "kriechen" durch den massiven Einsatz Aktionen und Filter, Funktionen in der unteren Ebene des WordPress . Dies erlaubt ihm, alle Anrufe in den Kern von WordPress, einschließlich derer, die mit der Datenbank (nicht nur ein paar) zu tun haben zu manipulieren.
Das Problem ist, dass, wenn etwas falsch ist, es auf der ganzen Spiel springt, wie es gehen wird, um Funktionen, die, in der Regel haben sie absolut keine Fehler zu brechen. Eines davon ist get_page_by_path() , historische und praktische Funktion von WordPress.
Badly von WPML betroffen sind, nicht mehr funktioniert, wenn die Art der von Ihnen angeforderte Seite wurde nicht von WPML selbst "verschluckt".

Die Seiten, einschließlich benutzerdefinierten Post Type (CPT), die als "zu übersetzen" im Backend Verwaltung von WPML bezeichnet, perfekt mit get_page_by_path() . In der Praxis - - in der Tabelle Der Defekt wird nur mit Seiten, die nicht im Lieferumfang enthalten sind gefunden icl_translations von WPML.

Zu dieser Lösung gibt es sofort, weil es die gleiche Kern WPML, was offensichtlich nicht empfehlen sollte ändern. Da ich jedoch ein registrierter Benutzer bin, meldete ich mich in dem Forum, wo gibt es eine Diskussion um die beste Lösung (um den Fehler in der SQL-Select-meiner Meinung nach zu korrigieren) zu finden. Wir hoffen, im nächsten Update.

Allerdings, wenn Sie nicht für fix warten können, gibt es eine ziemlich schnelle und schmerzlose Kunstgriff zu überwinden "vorübergehend" und das Problem ist - wie bereits erwähnt - um den Typ Seite als "zu übersetzen" im Backend von WPML angeklagt gesetzt. Aktualisiert Einstellungen. Aktualisieren Sie die Seite. Und setzen - schließlich - alles so, wie es vorher war. Nachdem die Seite "verstaut" wird in der Tabelle der WPML, get_page_by_path() kehrt zum business as usual.

Wir freuen sowieso patch ...

Es sind keine Kommentare für diesen Beitrag

Hinterlasse einen Kommentar

TAG XHTML PERMITS: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong> Code-Eingabe:
 <pre></pre> // blocco generico <code></code> // blocco generico [cc_actionscript][/cc_actionscript] // Actionscript [cc_actionscript3][/cc_actionscript3] // Actionscript 3 [cc_css][/cc_css] // CSS Style Sheet [cc_html][/cc_html] // HTML [cc_js][/cc_js] // Javascript [cc_objc][/cc_objc] // Objective-C [cc_php][/cc_objc] // PHP [cc_sql][/cc_sql] // SQL