Der Standardkategorie-Link für eine benutzerdefinierte Kategorie ist ein defekter Link

Ich entwickle ein Multisute-Plugin, das Websites mit einer bestimmten Vorlage einrichten soll, einschließlich der Einrichtung mehrerer statischer Seiten und Menüelemente sowie einer “Blog” -Kategorie für Blog-Posts.

Die Kategorie ist in Ordnung und enthält einen Beitrag, und ich habe herausgefunden, wie man den Menü-Link zur Blog-Kategorie mit der Option page_for_posts . WordPress erstellt jedoch Standardlinks zu jeder Kategorie in der Seitenleiste des Blogs unter “Kategorien“. Und die Verbindung, die es dort schafft, ist gebrochen.

Es verlinkt zu /category/blog , aber wenn Sie auf den Link klicken, erhalten Sie eine 404 – “Nun, das ist peinlich …”. Derselbe Link wird in der Fußzeile der Standard 404-Vorlage angezeigt und ist (offensichtlich) immer noch errorshaft.

Ich weiß nicht, warum dieser Link nicht funktioniert, aber ich habe herausgefunden, dass es funktioniert, wenn ich die Permalink-Einstellungen-Seite (oder einfach flush_rewrite_rules(); ) von der erstellten Site flush_rewrite_rules(); . Also ich habe das aus dem Setup-Skript des Plugins mit switch_to_blog ausgeführt, aber aus irgendeinem Grund, da das Plugin-Skript auf der Hauptseite läuft, funktioniert es nicht. Ich erhalte immer noch eine 404 für diese URL, bis ich sie von der erstellten Site aus starte (oder besuche die Permalink-Strukturseite auf der erstellten Site). Hier ist das Debug-Skript, das ich erstellt habe, das funktioniert, wenn ich es von der erstellten Site, aber nicht von der Haupt-Site besuche:

 //Filename: wp-admin/debug.php require_once('./admin.php'); global $wp_rewrite; switch_to_blog(84); //this is the created blog in question $wp_rewrite->init(); //JUST to make sure it's initialized for the correct blog $wp_rewrite->flush_rules(); restore_current_blog(); $wp_rewrite->init(); //To make sure it's set back to where it should be. 

Es gibt also einen Unterschied zwischen der Ausführung auf der Hauptseite und der erstellten Website. Ich weiß nicht, wie Rewrite-Regeln mit WordPress Multisite arbeiten … also weiß ich nicht, wie man in einem Fall das ändert, in einem anderen nicht. Die Regeln, die von get_option(rewrite_rules) für Blog 84 zurückgegeben werden, sind in beiden Fällen fast identisch, also habe ich das Gefühl, dass es einen weiteren Schritt geben muss, um einen Neuschreib-Cache oder etwas zu aktualisieren, wenn ich ihn von der erstellten Seite aus laufe (Blog 84) NICHT passiert, wenn ich es von der Hauptseite aus ausführen.

Irgendwelche Ideen? functioniert das Einfügen einer benutzerdefinierten Kategorie auf einer neu erstellten Site für Sie? Wie kann ich herausfinden, was sich ändert, damit es funktioniert, wenn ich flush_rewrite_rules von der erstellten Site aus starte?

Vielen Dank!

Solutions Collecting From Web of "Der Standardkategorie-Link für eine benutzerdefinierte Kategorie ist ein defekter Link"

Ich fand, dass der Grund flush_rewrite_rules(); funktionierte nicht, weil switch_to_blog einige der Eigenschaften von $wp_rewrite nicht neu initialisiert (ganz zu schweigen von anderen Teilen von WP), also flush_rewrite_rules noch einige der Regeln, die auf der Permalink-Struktur des aktuellen Blogs basierten (was ist nicht das selbe), eher als der geschaltete Blog (84). Sogar Aufruf von $wp_rewrite->init(); Die $extra_permastructs Eigenschaft von wp_rewrite wird nicht aktualisiert – hier befinden sich alle standardmäßigen Taxonomiepfade!

Ich musste zurückverfolgen, wo $extra_permastructs eingerichtet ist, und es stellt sich heraus, dass es durch verschiedene Aufrufe von $wp_rewrite->add_permastruct – glücklicherweise für mich, da wir nicht viele Plugins installiert haben, sind die einzigen relevanten Aufrufe für diese function von einem Init-Hook namens create_initial_taxonomies . Also das hat den Trick gemacht:

 add_action('switch_blog', function() { global $wp_rewrite; $wp_rewrite->init(); create_initial_taxonomies(); }); //[...] switch_to_blog($new_blog_id); flush_rewrite_rules(); restore_current_blog(); 

Allerdings … wie ich gerade von @skeltoac bei WP informiert wurde, bewirkt das einfache Löschen der rewrite_rules Option, dass WordPress die Regeln beim nächsten rewrite_rules einer Seite in diesem Blog automatisch neu generiert (und da es im neuen Blog ist, werden sie erzeugt von der richtigen Permalink-Struktur). Also eine einfachere Lösung ist:

 switch_to_blog($new_blog_id); delete_option('rewrite_rules'); // This option is automatically regenerated the next time someone loads the new blog! restore_current_blog(); 

Tatsächlich weiß ich nicht einmal, warum die Methode flush_rewrite_rules existiert – sie sollte nur die rewrite_rules löschen.

Allerdings – falls jemand jemals Rewrite-Regeln in einem anderen Blog bearbeiten muss, ohne sie aus irgendeinem Grund zu löschen, ist vielleicht das Obige hilfreich.

Vielleicht zum Beispiel, wenn Sie Hunderte von Rewrites haben, und Sie wollen nicht den nächsten unglücklichen Besucher warten auf sie alle in der Anfangsphase ihrer Anfrage neu generiert werden. Allerdings, wenn Sie so viele haben, gibt es eine gute Chance, dass Sie andere $extra_permastructs , die Sie in der switch_blog Aktion berücksichtigen müssen (es sei denn, Sie haben nur eine Menge Taxonomien) 🙂

Versuchen Sie einen etwas anderen Ansatz, indem Sie die Optionen in der Optionstabelle für die neuen Sites bearbeiten, anstatt die Regeln für das Umschreiben zu löschen.

Es kann sein, dass neue Websites nicht die Option permalink verwenden verwenden, damit die netten URLs erst erkannt werden, wenn die Umschreibungsregeln mit einem Wert für die Permalinks-Strukturgruppe gespeichert wurden.

Geben Sie Folgendes:

 //Filename: wp-admin/debug.php require_once('./admin.php'); switch_to_blog(84); //this is the created blog in question // add permalink option and remove rewrite rules so they get rerun update_option( 'permalink_structure', '/%year%/%monthnum%/%postname%/' ); update_option( 'rewrite_rules', array() ); // flush_rewrite_rules(); // if it doesn't work with the above try uncommenting this restore_current_blog();