it-swarm.com.de

Der Standard-Kategorielink für eine benutzerdefinierte Kategorie ist ein fehlerhafter Link

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

Die Kategorie ist gut erstellt und enthält einen Beitrag. Ich habe herausgefunden, wie der Menü-Link zur Blog-Kategorie mit der Option page_for_posts eingerichtet wird. WordPress erstellt jedoch Standardlinks zu jeder Kategorie in der Seitenleiste des Blogs unter "Kategorien". Und die Verbindung, die es dort herstellt, ist unterbrochen.

Es verlinkt auf /category/blog, aber wenn Sie auf den Link klicken, erhalten Sie eine 404 - "Nun, das ist peinlich ...". Der gleiche Link wird in der Fußzeile der 404-Standardvorlage angezeigt und ist (offensichtlich) immer noch defekt.

Ich weiß nicht, warum dieser Link nicht funktioniert, aber ich habe herausgefunden, dass es funktioniert, wenn ich die Permalink-Einstellungsseite (oder einfach flush_rewrite_rules();) von der erstellten Site aus besuche. Also habe ich das über das Setup-Skript des Plugins mit switch_to_blog ausgeführt, aber aus irgendeinem Grund funktioniert es nicht, da das Plugin-Skript auf der Hauptseite ausgeführt wird. Ich erhalte noch eine 404 für diese URL, bis ich sie von der erstellten Site aus starte (oder die Seite mit den Permalink-Strukturen auf der erstellten Site besuche). Hier ist das von mir erstellte Debug-Skript, das funktioniert, wenn ich es von der erstellten Site, aber nicht von der Haupt-Site aus 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.

Anscheinend gibt es also einen Unterschied zwischen der Ausführung auf der Hauptwebsite und der erstellten Website. Ich weiß nicht, wie das Umschreiben von Regeln mit WordPress Multisite funktioniert. Daher weiß ich nicht, wie ich feststellen kann, was sich in einem Fall ändert, in einem anderen jedoch nicht. Die Regeln, die von get_option(rewrite_rules) für Blog 84 zurückgegeben werden, sind in beiden Fällen fast identisch. Daher muss ein weiterer Schritt ausgeführt werden, um den Cache für das Neuschreiben zu aktualisieren, oder etwas, wenn ich ihn von der erstellten Site (Blog 84) aus ausführe. Dies geschieht NICHT, wenn Ich starte es von der Hauptseite aus.

Irgendwelche Ideen? Funktioniert 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!

1
mltsy

Ich fand heraus, dass flush_rewrite_rules(); nicht funktionierte, weil switch_to_blog einige der Eigenschaften von $wp_rewrite nicht neu initialisierte (ganz zu schweigen von anderen Teilen von WP), so dass flush_rewrite_rules immer noch einige Regeln basierend auf der Permalink-Struktur von generierte Der aktuelle Blog (der nicht derselbe ist) und nicht der Blog, zu dem gewechselt wurde (84). Selbst wenn $wp_rewrite->init(); aufgerufen wird, wird die $extra_permastructs -Eigenschaft von wp_rewrite nicht aktualisiert - hier befinden sich alle Standard-Taxonomiepfade!

Ich musste zurückverfolgen, wo $extra_permastructs eingerichtet ist, und es stellte sich heraus, dass dies durch verschiedene Aufrufe von $wp_rewrite->add_permastruct eingerichtet wurde. Da wir nicht viele Plugins installiert haben, stammen die einzigen relevanten Aufrufe dieser Funktion von einem aufgerufenen Init-Hook create_initial_taxonomies. Das hat also 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 erfahren habe, bewirkt das einfache Löschen der Option rewrite_rules, dass WordPress die Regeln beim nächsten Mal automatisch neu generiert Lädt alle Seiten in diesem Blog (und da es sich um in dem neuen Blog handelt, werden sie aus der richtigen Permalink-Struktur generiert). Eine einfachere Lösung ist also:

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 flush_rewrite_rules-Methode existiert - sie sollte nur den rewrite_rules löschen.

Falls jemand jedoch Regeln in einem anderen Blog tatsächlich bearbeiten muss, ohne sie aus irgendeinem Grund zu löschen, ist dies möglicherweise hilfreich.

Zum Beispiel, wenn Sie möglicherweise Hunderte von Änderungen vorgenommen haben und nicht möchten, dass der nächste unglückliche Besucher darauf wartet, dass alle während der Initialisierungsphase seiner Anforderung neu generiert werden. Wenn Sie jedoch so viele haben, besteht eine gute Chance, dass Sie einen anderen $extra_permastructs haben, den Sie in der Aktion switch_blog berücksichtigen müssen (es sei denn, Sie haben nur viele Taxonomien) :)

4
mltsy

Versuchen Sie es mit einem etwas anderen Ansatz, indem Sie die Optionen in der Optionstabelle für die neuen Sites bearbeiten, anstatt die Umschreiberegeln zu löschen.

Es kann sein, dass für neue Websites nicht die Option zum Verwenden von Permalinks festgelegt wurde, sodass die Nizza-URLs erst erkannt werden, wenn die Umschreiberegeln mit einem Wert für den Permalinks-Struktursatz gespeichert wurden.

Probieren Sie Folgendes aus:

//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();
1
sanchothefat