web-dev-qa-db-fra.com

Vider le cache sur les publications d'un type lorsqu'il se passe quelque chose sur une publication d'un autre type

EDIT: Basé sur la réponse de @ TimHallman, j'ai une question complémentaire, veuillez vous reporter au bas de cet article.

J'essaie de faire quelque chose qui dépasse mon esprit et plus j'y pense, plus je me pose de questions.

C'est le scénario que j'ai:

  • Poteaux personnalisés de type golfcourse , présentant chacun un parcours de golf.
  • Messages personnalisés de type clubnews .
  • Clubnews a le terme clubnewsowner qui leur est associé.
  • Les taxonomies de propriétaires de clubs sont identiques aux terrains de golf.

Ce que je fais est que (en utilisant un shortcode fait maison) je vérifie, sur chaque message de parcours de golf, si un ou plusieurs messages de type clubnews avec une taxonomie liée au parcours de golf spécifique existent. Si oui, montrez le/les clubnews-post sur le post du terrain de golf.

Cela fonctionne comme je le veux.

Cependant, j'utilise le plugin de mise en cache WP-Rocket sur ce site. Et parce que les messages clubnews sont ajoutés (aux messages golfcourse) en utilisant uniquement le php (pas d'ajax), WP-Rocket n'a pas la moindre idée que le contenu a été modifié sur le message golfcourse-post chaque fois qu'un message clubnews a été ajouté, mis à jour ou supprimé. Cela signifie que je dois effectuer un nettoyage manuel de la cache du poste de parcours de golf associé chaque fois que le scénario mentionné se produit.

Heureusement, WP-Rocket a une fonction pour cela:

//clean post with ID 5
rocket_clean_post( 5 );

J'ai réussi à créer une sorte de pseudo-code:

function clearPageCacheBasedOnTaxOfClubnews() {
    if ( ( clubnews is created ) || ( clubnews is updated )  || ( clubnews is deleted ) ) {

        $customPost = clubnewsPostID;

        // The result here is always only one taxonomy
        $taxonomyOfCustompPost = get_post_taxonomies( $customPost );

        switch ($taxonomyOfCustompPost) {
            case 'golfcourseOne': rocket_clean_post( 5 );
            break;
            case 'golfcourseTwo': rocket_clean_post( 8 );
            break;
        }
    }
}
add_action( 'when?', 'clearPageCacheBasedOnTaxOfClubnews', 10, ?);

Je pense que le code ci-dessus fonctionnera, mais il y a beaucoup de choses dont je ne suis pas sûr:

  1. Comment puis-je obtenir l'ID de la publication clubnews en cours de création/mise à jour/suppression?
  2. Comment puis-je vérifier s'il est en train d'être créé/mis à jour/supprimé?
  3. À ce stade, ma tête commence à tourner, et je ne suis plus sûr de ce que je me demande ...

Toute aide est appréciée!


Question de suivi:

Je crois que @ Tim Hallman résout au moins les deux tiers de ce problème (il me faut une action supplémentaire pour lorsqu'un message personnalisé du clubnews est supprimé) avec sa réponse ci-dessous.

Cependant, je ne peux pas faire ce travail. Mon code produit un écran blanc de la mort, sans générer aucune erreur php. Ce que je pense, c’est que WP Rocket utilise toutes les ressources du serveur pour vider le cache de messages individuels. Je ne suis pas sûr cependant.

C'est le code:

add_action( 'save_post', 'clearPageCacheBasedOnTaxOfClubnews');


function clearPageCacheBasedOnTaxOfClubnews($post_id) {

    /* Is has_term() used correctly here? In the codex it says that the
     * taxonomy parameter is optional, other places on the Internet claims
     * the opposite...
     */
    if ( has_term('clubnewsowner', '', $post_id ) {

        // The result here is always only one taxonomy
        $taxonomyOfCustompPost = get_post_taxonomies( $post_id );

        /* The codex says get_post_taxonomies() returns an array. The code
         * on the line below produces a php fatal error though.
         */
        $taxonomyOfCustompPost = $taxonomyOfCustompPost[0];

        /* This is where the connection between the taxonomy of the
         * Clubnews custom posts and the golf course pages happens
         */
        switch ($taxonomyOfCustompPost){
            case 'Course One': $courseID = 123; break;
            case 'Course Two': $courseID = 234; break;
            case 'Course Three': $courseID = 345; break;
            ...
        }

        //This cleans the cache of the selected post
        rocket_clean_post( $courseID );
    }
}

J'ai essayé cela dans différentes variantes, et j'obtiens une erreur fatale à cause de $ taxonomyOfCustompPost = taxonomyOfCustompPost [0]; ou je reçois un écran blanc de la mort sans aucune erreur php du tout.

Des suggestions sur où aller à partir d'ici?

1
erolha

Je suppose qu'un moyen rapide et sale de réaliser ce que vous voulez est d'effacer tout le cache du site, comme ceci:

function clear_rocket_cache_on_post_save() {
     rocket_clean_domain();
}
add_action( 'save_post', 'clear_rocket_cache_on_post_save' );

Sinon, vous aurez besoin de faire une requête pour obtenir le post correspondant, quelque chose comme ceci devrait fonctionner:

  function clear_rocket_cache_on_post_save( $post_id ) {

       // $result_id = tax query by $post_id
       rocket_clean_post( $result_id );

  }
  add_action( 'save_post', 'clear_rocket_cache_on_post_save' );

Vous pouvez trouver plus d'informations sur les fonctionnalités de mise en cache "prêtes à l'emploi" de Wordpress ici: https://codex.wordpress.org/Transients_API

et ici: https://codex.wordpress.org/Class_Reference/WP_Object_Cache

De nombreux thèmes n'utilisent pas cette fonctionnalité principale, mais c'est là.

METTRE À JOUR:

Si vous n'obtenez pas de sortie de débogage sur votre écran, le meilleur moyen de comprendre pourquoi vous obtenez des erreurs est d'utiliser le fichier debug.log.

Commencez par placer cet extrait de code au bas de votre fichier functions.php.

if (!function_exists('write_log')) {
    function write_log ( $log )  {
        if ( true === WP_DEBUG ) {
            if ( is_array( $log ) || is_object( $log ) ) {
                error_log( print_r( $log, true ) );
            } else {
                error_log( $log );
            }
        }
    }
}

Puis modifiez votre fichier wp-config.php pour inclure ces éléments:

define( 'WP_DEBUG', true);
define( 'WP_DEBUG_DISPLAY', false );
define( 'WP_DEBUG_LOG', true );

Ensuite, dans votre dossier wp-content, créez un nouveau fichier appelé debug.log. Vous êtes maintenant prêt à déboguer.

Maintenant, quel que soit le résultat que vous voulez afficher, vous utilisez la fonction write_log($some_variable). Les erreurs de débogage sont alors générées dans debug.log. Faites cela et je parie que vous verrez pourquoi vous obtenez un WSOD./codage heureux

0
Tim Hallman

Ok, alors ça marche. La solution est basée sur la réponse de @ Timhallman ci-dessous/ci-dessus ici.

Une des raisons pour lesquelles je n’ai pas réussi à le faire fonctionner est que j’ai été confondu avec ce que sont un terme et une taxonomie. Je pensais à un terme contenu taxonomies quand c'est le contraire ....

Malgré de bons conseils pour ne pas coder en dur des choses comme celle-ci, ne pas mettre en cache des sites dynamiques, etc., il existe des scénarios dans lesquels un code de ce type est nécessaire. Et voici le code de travail:

// Run the function when a post is created or updated
add_action( 'save_post', 'clearPageCacheBasedOnTaxOfClubnews');
function clearPageCacheBasedOnTaxOfClubnews($post_id) {

    $taxonomyOfCustompPost = get_post_taxonomies( $post_id );
    // In this special case, there is always only one taxonomy!
    $taxCustompPost = $taxonomyOfCustompPost[0];

    if ( $taxCustompPost != 'clubnewsowner' ) {
        return;
    }

    if ( $taxCustompPost == 'clubnewsowner' ) {
        $terms = wp_get_post_terms( $post_id, 'clubnewsowner', array("fields" => "names"));
        $term = $terms[0];;

        switch ($term){
            case 'Course One': $courseID = 123; break;
            case 'Course Two': $courseID = 456; break;
            case 'Course Three': $courseID = 789; break;
            ...
        }

        rocket_clean_post( $courseID );


    }
}

//Run the function when the post is deleted
add_action('trash_post','clearPageCacheWhenCPDeleted',1,1);
function clearPageCacheWhenCPDeleted($post_id){

    if(!did_action('trash_post')){

        $taxonomyOfCustompPost = get_post_taxonomies( $post_id );
        // In this special case, there is always only one taxonomy!
        $taxCustompPost = $taxonomyOfCustompPost[0];

        if ( $taxCustompPost != 'clubnewsowner' ) {
            return;
        }

        if ( $taxCustompPost == 'clubnewsowner' ) {

            $terms = wp_get_post_terms( $post_id, 'clubnewsowner', array("fields" => "names"));
            $term = $terms[0];;

            switch ($term){
                case 'Course One': $courseID = 123; break;
                case 'Course Two': $courseID = 456; break;
                case 'Course Three': $courseID = 789; break;
            }

            rocket_clean_post( $courseID );

        }
    }
}
0
erolha