web-dev-qa-db-fra.com

Où accrocher l'action de mon plugin

J'écris un plugin qui chaque fois que vous:

  • publier un post
  • éditer un déjà publié
  • supprimer un article publié

il effectue plusieurs requêtes dans la base de données, récupère certaines données de publication (titre, extrait, catégorie, id, url, etc.) et exporte le fichier JSON. Celui-ci je l'utilise au début pour dessiner tous les éléments.

J'ai également des métaboxes personnalisées dans le panneau d'administration où vous pouvez ajouter des métadonnées personnalisées.

Mon problème maintenant

Chaque fois que je crée un nouveau message et que je le publie directement - sans l'enregistrer au préalable (sinon, l'export fonctionne), le tableau du fichier JSON contenant les données des métadonnées personnalisées sont vides. Si je vérifie si la base de données, via myPhpAdmin, les valeurs sont stockées. Le plug-in pour les métadonnées personnalisées est lié à l'action "save_post". Le plug-in d'exportation vers JSON est lié à l'action "publish_post".

J'ai même cette fonction dans le plugin pour trouver l'action avec le numéro de priorité le plus élevé et la mienne après.

function get_latest_priority( $filter )
{
  if ( empty ( $GLOBALS['wp_filter'][ $filter ] ) ){
    return PHP_INT_MAX;
  }

  $priorities = array_keys( $GLOBALS['wp_filter'][ $filter ] );
  $last       = end( $priorities );

  return $last+1;
}
function export_posts_in_json (){



function register_plugin (){
  add_action( 'publish_post', 'export_posts_in_json', get_latest_priority( current_filter() ), 1);
}
add_action( 'publish_post', 'register_plugin', 0 );

C’est ce que la var_dump( $GLOBALS['wp_filter'][ $filter ]);$filter est current_filter() affiche:

array(2) {
  [0]=>
  array(1) {
    ["register_custom_save"]=>
    array(2) {
      ["function"]=>
      string(20) "register_custom_save"
      ["accepted_args"]=>
      int(1)
    }
  }
  [5]=>
  array(1) {
    ["_publish_post_hook"]=>
    array(2) {
      ["function"]=>
      string(18) "_publish_post_hook"
      ["accepted_args"]=>
      int(1)
    }
  }
}

Donc, je mets 6 en priorité.

Pourquoi diable ça ne marche pas? Où devrais-je accrocher au travail? Le problème se situe-t-il dans le plug-in de métadonnées personnalisé ou dans celui d'exportation?

Si vous avez besoin de l'intégralité du plugin, faites-le moi savoir, mais je ne pense pas que ce soit nécessaire, car cela fonctionne lorsque la publication est déjà enregistrée dans la base de données.

UPDATE

J'ai accroché le plug-in à 'save_post' avec une priorité ultérieure et la fonction d'exportation ne s'exécute que si le $ post_status de la publication actuelle est 'publier'.

function check_status( $post ){
  $p = get_post( $post );
  $p_status = $p->post_status;
  if($p_status == 'publish'){
    export_posts_in_json();
  }
}
add_action( 'save_post', 'check_status', 20, 1 );

Cela ne résout pas le problème cependant. Je ne peux pas capturer si le poste actuel change le statut de publication en brouillon. La fonction export_posts_in_json() interroge uniquement les publications publiées. Donc, si je suis capable de l'exécuter pour le cas ci-dessus, je parviendrai à supprimer ce message du fichier JSON.

1
Achillx

Bien, je réponds à ma propre question mais, après de nombreuses recherches, des traces et des erreurs, j'ai trouvé une solution.

J'utilise le crochet d'action transition_post_status pour rechercher des modifications dans le statut de l'article. Parce que cette action s'exécute avant celle de save_post et que mes métadonnées personnalisées ne sont pas encore enregistrées dans la base de données, je n'appelle pas directement la fonction d'exportation. Au lieu de cela, j'appelle add_action, elle est connectée à save_post et lui donne une priorité ultérieure de sorte que tout soit enregistré en premier dans la base de données.

function check_status( $new_status, $old_status, $post ){

  if ( $post->post_type == 'post'){

    //if the posts gets unpublished
    if ( $old_status == 'publish' && $new_status != 'publish' ){
      add_action( 'save_post', 'export_posts_in_json', 20, 1 );
    }

    //if the post gets published, regardless of the previous status
    elseif ( $new_status == 'publish' ){
      add_action( 'save_post', 'export_posts_in_json', 20, 1 );
    }
  }

}
add_action( 'transition_post_status', 'check_status', 10, 3);

J'espère que cela aidera d'autres personnes.

1
Achillx

Quelque chose d’important - lorsque vous créez un nouveau message, la première chose que WordPress fait est une sauvegarde automatique. Par conséquent, la première fois, les valeurs doivent être vides. C’est peut-être ce que vous vivez - je ne vois pas votre code complet, mais je vois

Le plug-in pour les métadonnées personnalisées est lié à l'action "save_post".

En outre, lors de l'édition, WordPress effectue également une sauvegarde automatique toutes les 60 secondes par défaut. Alors peut-être vérifier les sauvegardes automatiques dans votre code, ou essayer de désactiver complètement la sauvegarde automatique.

function disable_autosave() {
    wp_deregister_script('autosave');
}
add_action('wp_print_scripts','disable_autosave');
1
johnh10