Vor einiger Zeit musste ich einen Online-Shop auf WordPress erstellen. Es gibt viele gute Lösungen im offiziellen Repository. Unter ihnen ist der Anführer - Woocommerce - schon lange aufgefallen. Ich denke, er braucht keine Einführung. Eine millionenschwere Armee von Benutzern, Hunderte von kostenpflichtigen und kostenlosen Erweiterungen und unglaubliche Flexibilität. Aus diesem Grund verfügt Woocommerce über mehr als 5 Millionen aktive Installationen und deckt einen großen Teil der Online-Shops weltweit ab.
Trotzdem habe ich beschlossen, mein Fahrrad zu erfinden. Teilweise, um Fähigkeiten zu verbessern, teils, um zu versuchen, ein nicht ressourcenintensives und schnell genuges E-Commerce-Plugin zu erstellen. Ich habe es kürzlich
im offiziellen Repository veröffentlicht , daher lade ich alle ein, es zu testen. In diesem Artikel werde ich keinen Überblick über die Möglichkeiten geben, sondern nur über einige interessante technische Lösungen sprechen.

Permalinks Problem
Im Allgemeinen sind Permalinks in WordPress eine der schwierigsten Websites, da sie die Lösung einer Reihe von Problemen mit Verbindungen und Abhängigkeiten erfordern. WpStore kann Permalinks verwalten. Sie können beispielsweise den
product
Slug aus der
product
URL entfernen, in Ihren eigenen ändern oder den Kategorie-Slug oder sogar die Kategorie-Verschachtelung hinzufügen.
./-/---/---/-/
können folgendermaßen aussehen:
./-/---/---/-/
. Nicht schlecht.
Ich musste viel schwitzen, um Kategorien zu verschachteln. Mit der Funktion
wp_get_object_terms,
wir die Kategorien des angegebenen Produkts. Anschließend erfassen wir im Zyklus die Schwachstellen und bilden die URL gemäß der Hierarchie von übergeordnet zu untergeordnet. Um die notwendigen Links anzuzeigen, verwenden wir den Filter post_link. Hier ist nur ein Teil des Codes (Sie können den vollständigen Code in der Quelle sehen):
add_filter( 'post_link', 'wpsl_post_type_permalink', 20, 3 ); add_filter( 'post_type_link', 'wpsl_post_type_permalink', 20, 3 ); function wpsl_post_type_permalink( $permalink, $post_id, $leavename ) { .... if ( is_admin() ) {
Zu diesem Zeitpunkt trat jedoch ein Leistungsproblem auf. Die Website begann langsamer zu arbeiten, insbesondere auf der Ausgabeseite mehrerer Produkte. Auf der Kategorieseite mit der Ausgabe von nur 16 Produkten wurden beispielsweise fast 90 Abfragen an die Datenbank gestellt, und die Serverantwortzeit stieg dramatisch um etwa 25 bis 30%.
Es stellte sich heraus, dass WordPress beim Aufrufen der Funktion_permalink viele Operationen ausführt: Es erhält den CNC-Typ und sammelt die
Post- Daten abhängig von diesem Typ. Um 1 Link anzuzeigen, erzeugt WordPress mehrere nicht zwischengespeicherte Anforderungen an die Datenbank. Darüber hinaus ist der Prozess der Erlangung von Taxonomien und Hierarchien von Waren nicht der schnellste.
Da die ständige Generierung des Links nicht zu uns passt, ist es logisch, ihn irgendwo zu speichern und dann einfach von dort zu ziehen. Es wurde beschlossen, das spezielle
guid
Feld der Tabelle
guid
. Obwohl WP-Entwickler eine Änderung nicht empfehlen, können wir diese Warnung aus mehreren Gründen ignorieren:
- guid wird verwendet, um RSS zu generieren, und nur wenige Leute verwenden es.
- In RSS werden nur Einträge angezeigt, und unser Beitragstyp ist Produkt.
Um die Links in der Datenbank korrekt zu halten, hängen wir an das Ereignis
save_post
eine Funktion, die das Guid-Feld aktualisiert:
add_action( 'save_post', 'wpsl_guid_rewrite', 100 ); function wpsl_guid_rewrite( $id ) { if( !is_admin() ) return; if( defined( 'DOING_AUTOSAVE' ) && DOING_AUTOSAVE ) return false; if ( strpos( get_option( 'product_permalink' ), '%category%' ) !== false || strpos( get_option( 'product_permalink' ), '%categories%' ) !== false ) { if( $id && get_post_type( (int)$id ) == 'product' ){ global $wpdb; $wpdb->update( $wpdb->posts, [ 'guid' => ( get_permalink( $id ) ) ], [ 'ID' => intval( $id ) ] ); } clean_post_cache( $id ); } }
Es bleibt uns
post_type_link
die
post_type_link
am
post_type_link
Hook
post_type_link
und den generierten Link auszugeben:
add_filter( 'post_type_link', 'wpsl_get_permalink_change', 10, 4 ); function wpsl_get_permalink_change( $post_link, $post, $leavename, $sample ){ if ( isset( $post->guid ) && $post->guid && $post->post_type == 'product' && ( strpos( get_option( 'product_permalink' ), '%category%' ) !== false || strpos( get_option( 'product_permalink' ), '%categories%' ) !== false ) ) { return $post->guid; } return $post_link; }
Hier überprüfen wir die Vollständigkeit des Guid-Feldes, des Post-Typs und des CNC-Typs. Wenn die Werte der drei Parameter zu uns passen, zeigen Sie den zuvor gespeicherten Link an.
Das Beste ist nun: Sehen Sie sich die Ergebnisse an. Die Anzahl der Anfragen an die Datenbank hat sich fast verdoppelt - von fast 90 auf 44! Die Serverantwortzeit auf dem Testhosting sank auf akzeptable 0,24 Sekunden.
Die Aktualisierung des Guid-Feldes erfolgt nicht nur während der Erstellung und Bearbeitung von Waren. Das Plug-In verfügt über ein integriertes System zum Importieren von Waren über CSV, sodass die Aktualisierung auch nach Abschluss des Imports erfolgt.
Update:
Plugin-Dokumentation