web-dev-qa-db-fra.com

Le lien de catégorie par défaut pour une catégorie personnalisée est un lien brisé

Je développe un plug-in Multisute qui est censé configurer des sites à l'aide d'un modèle spécifique, notamment la configuration de plusieurs pages statiques et éléments de menu, ainsi que la catégorie "Blog" pour les articles de blog.

La catégorie est bien créée et contient un message. J'ai découvert comment configurer le lien de menu vers la catégorie de blog à l'aide de l'option page_for_posts. Toutefois, WordPress crée des liens par défaut vers chaque catégorie dans la barre latérale du blog sous "Catégories". Et le lien que cela crée là-bas est brisé.

Il est lié à /category/blog, mais lorsque vous cliquez sur le lien, vous obtenez un message 404 - "Eh bien, c'est embarrassant ...". Le même lien apparaît dans le pied de page du modèle 404 par défaut et est toujours cassé (évidemment).

Je ne sais pas pourquoi ce lien ne fonctionne pas, mais j'ai compris que si je visitais la page des paramètres de permalien (ou exécutais simplement flush_rewrite_rules();) à partir du site créé, cela fonctionnait. J'ai donc lancé cela depuis le script d'installation du plugin, en utilisant switch_to_blog, mais pour une raison quelconque, puisque le script du plugin est exécuté sur le site principal, cela ne fonctionne pas. Je reçois toujours un 404 pour cette URL jusqu'à ce que je l'ait exécuté à partir du site créé (ou que vous visitiez la page des structures permalink du site créé). Voici le script de débogage que j'ai créé et qui fonctionne si je le visite depuis le site créé, mais pas depuis le site principal:

//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.

Donc, apparemment, il y a une différence entre son exécution sur le site principal et sur le site créé. Je ne sais pas comment fonctionnent les règles de réécriture avec wordpress multisite ... donc je ne sais pas comment trouver ce qui change dans un cas mais pas dans un autre. Les règles renvoyées par get_option(rewrite_rules) pour le blog 84 sont presque identiques dans les deux cas. Je pense donc qu'il faut encore une étape pour actualiser le cache de réécriture ou quelque chose lorsque je l'exécute à partir du site créé (blog 84), cela ne se produit PAS lorsque Je le lance depuis le site principal.

Des idées? L'insertion d'une catégorie personnalisée sur un site nouvellement créé fonctionne-t-elle pour vous? Comment puis-je savoir ce qui change pour le faire fonctionner lorsque je lance flush_rewrite_rules à partir du site créé?

Merci!

1
mltsy

J'ai trouvé que la raison pour laquelle flush_rewrite_rules(); ne fonctionnait pas était que switch_to_blog ne réinitialisait pas certaines des propriétés de $wp_rewrite (sans parler d'autres parties de WP), de sorte que flush_rewrite_rules générait toujours certaines règles basées sur la structure de permalien de le blog actuel (qui n'est pas identique), plutôt que le blog commuté (84). Même appeler $wp_rewrite->init(); ne met pas à jour la propriété $extra_permastructs de wp_rewrite - qui contient tous les chemins de taxonomie par défaut!

J'ai dû remonter où $extra_permastructs est configuré, et il s'avère que c'est configuré par divers appels à $wp_rewrite->add_permastruct - heureusement pour moi, comme nous n'avons pas beaucoup de plugins installés, les seuls appels pertinents pour cette fonction proviennent d'un hook d'init appelé create_initial_taxonomies. Donc, cela a fait le tour:

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();

Cependant ... comme je viens d’être informé par @skeltoac de WP, il suffit ( de supprimer l’option rewrite_rules pour que WordPress régénère automatiquement les règles la prochaine fois que quelqu'un charge n'importe quelle page de ce blog (et comme il est sur le nouveau blog, elles sont générées à partir de la structure de permalien correcte). Donc, une solution plus simple est:

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();

En fait, je ne sais même pas pourquoi la méthode flush_rewrite_rules existe - elle devrait simplement supprimer le rewrite_rules.

Cependant, si jamais quelqu'un devait réellement éditer réécrire les règles sur un autre blog sans les effacer pour une raison quelconque, peut-être que ce qui précède sera utile.

Peut-être, par exemple, si vous avez des centaines de réécritures et que vous ne voulez pas que le prochain visiteur malchanceux attende qu'elles soient toutes régénérées pendant la phase d'initialisation de leur demande. Cependant, si vous en avez autant, il y a de bonnes chances que vous ayez un autre $extra_permastructs que vous devrez prendre en compte dans l'action switch_blog (à moins que vous n'ayez que beaucoup de taxonomies) :)

4
mltsy

Essayez une approche légèrement différente en modifiant les options du tableau des options pour les nouveaux sites plutôt que de supprimer les règles de réécriture.

Il se peut que les nouveaux sites ne soient pas dotés de l'option d'utilisation permalien; les URL de Nice ne sont donc pas reconnues tant que les règles de réécriture n'ont pas été enregistrées avec une valeur pour l'ensemble de structures permaliens.

Essayez ce qui suit:

//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