web-dev-qa-db-fra.com

Supprimer un transitoire Wordpress d'un shortcode sur Page/Post update

J'espère que quelqu'un peut m'aider. Je dois supprimer un transitoire pour tous les codes courts situés sur un message/une page lorsque cette page est mise à jour. Ainsi, la mise à jour de la page devrait supprimer le transitoire uniquement pour les codes courts situés sur cette page. Si cela n’est pas possible, il serait utile que tous les transitoires de shortcode soient supprimés lors de toute mise à jour de page.

J'ai essayé d'utiliser l'action save_post mais rien ne se passe, je dois donc faire quelque chose de mal.

En outre, le problème est que je génère un identifiant de code court, basé sur un identifiant de poste et l'incrémentation d'une variable statique.

Ainsi, ce n’est que lorsque j’appelle la méthode pour supprimer un transitoire dans shortcode-template.php que j’ai accès à l’ID de la page en cours et que je peux ensuite supprimer un transitoire lié à la combinaison ID de page/ID de code court. Mais alors le transitoire est supprimé chaque fois que le shortcode est chargé. Et si je n'appelle pas la fonction delete_transient, il semble que ce ne soit pas lié à l'action save_post, car rien ne se produit.

J'imagine que c'est parce que l'ID de la page actuelle ne peut pas être récupéré dans une classe, mais uniquement lorsqu'il est utilisé quelque part sur la page. Mais je ne sais pas comment faire pour contourner cela.

Voici ma classe:

  class MainClass {

            private static $shortcode_increment = 0;

            private function __construct() {
                add_action( 'save_post', array( $this, 'update_page_delete_transient') );
            }

            public static function increment_id() {
                global $post;

                self::$shortcode_increment++;

                return 'shortcode_' . $post->ID . "_" . self::$shortcode_increment;
            }

            // delete the shortcode cache on page update
            public function update_page_delete_transient() {

            delete_transient( 'weather_'.self::increment_id() );
            }
    }

Toute aide est appréciée. Merci.

METTRE À JOUR

Je ne suis pas sûr de savoir comment les actions devraient fonctionner. Si je comprends bien, la fonction ajoutée à l'action doit être activée lorsque cette action se produit. Il n'est donc pas nécessaire d'appeler cette fonction. Ou est-il?

La fonction ajoutée à l'action sera-t-elle automatiquement activée après l'instanciation de la classe dans shortcode-template.php, par exemple, puisque l'action elle-même figure dans la construction? Ou dois-je appeler la fonction delete_transient dans shortcode-template.php pour que cela fonctionne? Mais lorsque je le fais, il s'exécute chaque fois que le widget est chargé, et non sur save post/page.

MISE À JOUR 2

Donc, si je supprime le post ID de la fonction increment ID, je peux mal résoudre le problème de la mise à jour 1 ci-dessus. La fonction delete_transient est activée lorsque je crée une instance d'un objet et que celui-ci est appelé page/post save.

Maintenant, le problème qui reste est de savoir comment passer de l'ID unique de Shortcode à la fonction delete_transient, si l'ID est augmenté uniquement dans le shortcode-template.php lors de la création d'un nouveau shortcode. Ou ce serait encore mieux si je pouvais en quelque sorte passer l'ID de page et l'ID de shortcode à la fonction delete_transient de la classe principale, afin de pouvoir supprimer un transitoire spécifique pour un shortcode spécifique lors de la mise à jour.

Existe-t-il un moyen de renvoyer les données du shortcode-template.php à la méthode Object?

1
Arakis

Si vous souhaitez enregistrer toutes les données de codes abrégés dans une seule variable, vous pouvez le réinitialiser facilement.

Exemple quelque part en shortcode (pseudocode):

$page_cache = get_transient("page_{$page_id}");
if ( empty($page_cache ) ){
  global $shortcode_index;
  $page_cache[$shortcode_index] = **some data that cached**;
  set_transient( "page_{$page_id}", $page_cache, **some time** );
  $shortcode_index++;
  ****
}

Et ensuite, vous pouvez le supprimer simplement en identifiant page_id lors de l'enregistrement.

 delete_transient( "page_{page_id}" );
1
Igor Sorish