web-dev-qa-db-fra.com

Mises à jour permanentes

Remarque: cette question apparaît également sur https://stackoverflow.com/questions/44060613/update-permalinks-when-new-category-added-to-custom-post-type-taxonomy (mais ne reçoit pas beaucoup amour).

Ont créé une collection de types de messages personnalisés (CPT) pour un thème WordPress sur lequel je travaille (avec leurs propres taxonomies et balises). Aux fins de cette question, je me concentrerai sur le CPT "projets".

Lorsqu'une nouvelle catégorie de projet est ajoutée, puis liée à dans le menu de navigation, l'utilisateur verra une erreur 404 jusqu'à ce que les permaliens soient enregistrés, ce qui effacera la mise en cache de la route de WordPress.

Je pensais que le meilleur moyen d'y parvenir serait d'utiliser flush_rewrite_rules ();

Bien que, en disant cela - je ne prenne pas cela à la légère, car la meilleure pratique recommande fortement d'utiliser uniquement cette fonction lors de l'activation/désactivation d'un plug-in. https://codex.wordpress.org/Function_Reference/flush_rewrite_rules#Usage

Ce que je veux faire, c'est me lier à l'action qui se déclenche lorsqu'une nouvelle catégorie CPT est créée (via l'écran post ou admin), puis exécuter la procédure de réécriture du flush sur cette action de manière à ce que WP admin ne Ne pas avoir à s’occuper de forcer la mise en cache de la route Wordpress via une mise à jour sur les permaliens.

J'ai regardé ceci Crochet sur Ajouter une nouvelle catégorie pour une solution possible et a essayé d'utiliser ce code:

function custom_created_term( $term_id, $tt_id, $taxonomy )
{
    $project_cpt = 'CPT_PROJECT';  // Edit this to your needs
    $project_tax = 'TAX_PROJECT_CATS';  // Edit this to your needs

    if( DOING_AJAX && $project_tax === $taxonomy )
    {
        // Try to get the post type from the post id in the referred page url
        // Example: /wp-admin/post.php?post=2122&action=edit&message=1

        parse_str( parse_url( wp_get_referer(), PHP_URL_QUERY ) , $params );

        if( isset( $params['post'] ) )
        {
            $post_id = intval( $params['post'] );
            if( $post_id > 0 && $project_cpt === get_post_type( $post_id ) )
            {
                flush_rewrite_rules(true);

            }
        }
    }
}

Mais ça ne marche pas vraiment pour moi. Pas sûr si j'utilise le bon outil ici ou si je fais quelque chose de mal. J'ai un peu cherché la solution, mais je n'ai pas trouvé de bonne solution à mon problème ici (impossible de trouver le moyen de créer de nouvelles catégories CPT).

1
Ryan Coolwebs

Ce n'est pas ainsi que fonctionnent les taxonomies personnalisées et les types d'article

C'est ce que tu fais:

  • Sur le hook init, appelez register_custom_taxonomy ou register_post_type
  • Si vous modifiez vos appels en register_custom_taxonomy ou register_post_type ou si vous en ajoutez de nouveaux dans votre code, régénérez des permaliens en visitant la page des paramètres de permaliens et en cliquant sur Enregistrer.
  • Vous avez terminé

Donc, si je suis les étapes ci-dessus et crée une nouvelle taxonomie nommée colour, je n'ai pas besoin de vider les liens permanents pour créer des termes red ou blue. Si je créais une nouvelle taxonomie nommée shape, je supprimerais les permaliens, mais une seule fois, c'est pour que je ne reçois pas de 404 quand je visite des termes de formes sur le front-end. Il en va de même pour les types de publication personnalisés

Gardez à l'esprit que flush_rewrite_rules est une fonction très coûteuse et que vous ne devriez jamais avoir à l'appeler. Un exemple de son appel possible est un crochet d’activation de plugins après sa première installation ou une commande WP CLI.

Comment éviter les 404

Utilisez register_activation_hook pour vider les règles de réécriture. Cela sera appelé lorsque votre plugin sera activé (et seulement le temps qu’il est activé, pas toutes les pages chargées).

https://codex.wordpress.org/Function_Reference/register_activation_hook

Flushing sur la création de chaque terme est à la fois inutile et dommageable

Et si je inscrivais mon CPT/CT dans un thème?

Vous pouvez utiliser le hook after_theme_switch pour vider les règles de réécriture. Toutefois, enregistrer des types d'article et des taxonomies dans un thème est une mauvaise pratique. Cela pose des problèmes de portabilité des données, par exemple si un utilisateur change de thème, il perd ses données.

Les thèmes déterminent l'apparence d'un site et les fonctionnalités, en particulier les données, doivent être définies dans les plugins.

1
Tom J Nowell

Ok, solution assez simple que je suis venu avec. Il suffit de mettre ce code ci-dessous dans mon includes dans function.php:

add_action('wp_update_nav_menu_item', function ()
{
    flush_rewrite_rules(true);
}, 10, 2);

Cela se connecte simplement à la fonction de mise à jour du menu de navigation, de sorte qu'il se déclenche chaque fois que le menu est mis à jour par l'utilisateur admin.

Je sais que la réécriture de la couleur est une fonction "coûteuse", mais elle ne sera appelée que lorsque le menu de navigation sera mis à jour, ce qui ne sera pas si fréquent.

0
Ryan Coolwebs