web-dev-qa-db-fra.com

Quelle action est appelée lorsque les brouillons sont enregistrés?

J'aimerais ajouter un champ de métadonnées à la publication en cours en fonction d'une case à cocher dans une méta-boîte personnalisée pour pouvoir basculer mon plug-in personnalisé poste par poste.

Pour cela, j'ai codé les choses suivantes

  1. générer une meta box sur la nouvelle page et la nouvelle page
  2. gérer la valeur de la case à cocher dans la boîte méta et définir les métadonnées de l'article ou de la page en conséquence

J'ai réussi en 1. Mais j'ai des problèmes avec le numéro 2. J'ai le code suivant pour gérer le paramétrage des métadonnées:

Mettre à jour les métadonnées en fonction de la valeur de la case à cocher dans la boîte méta

// register action
add_action( 'save_post', 'cl_save_postdata');
/* When the post is saved, saves our custom data */

function cl_save_postdata( $post_id ) {
  // check if $post_id is just a revision id and if so get the parent id
  if($parent_id = wp_is_post_revision($post_id)){
    $post_id = $parent_id;
  }  
  // verify this came from the our screen and with proper authorization,
  // because save_post can be triggered at other times

  if ( !wp_verify_nonce( EMU2_I18N_DOMAIN, plugin_basename(__FILE__) ) )
      return $post_id;
  // verify if this is an auto save routine. 
  // If it is our form has not been submitted, so we dont want to do anything
  if ( defined('DOING_AUTOSAVE') && DOING_AUTOSAVE ) 
      return $post_id;

  // Check permissions
  if ( 'page' == $_POST['post_type'] ) {
    if ( !current_user_can( 'edit_page', $post_id ) )
        return $post_id;
  } else {
    if ( !current_user_can( 'edit_post', $post_id ) )
        return $post_id;
  }

  // OK, we're authenticated: we need to find and save the data

  if ($_POST['cl-activated']) {
     add_post_meta( $post_id, 'cl-activated', true, true) or update_post_meta( $post_id, 'cl-activated', true);
  } elseif (get_post_meta ($post_id, 'cl-activated', true)) {
    delete_post_meta( $post_id, 'cl-activated');
  }
  return $cl_is_activated;
}

L'idée de ce code est de définir ou de désélectionner les métadonnées "activées par la clé" en fonction de la valeur de la case à cocher. La forme de la meta box est la suivante:

Générer du code HTML d'une méta-boîte

function cl_generate_inner_box($post, $metabox) {
      // Use nonce for verification
  wp_nonce_field( plugin_basename(__FILE__), EMU2_I18N_DOMAIN );

  // The actual fields for data entry
  echo '<label for="cl-activated">';
       _e("Activate collect links", EMU2_I18N_DOMAIN );
  echo '</label> ';
  echo '<input type="checkbox" id="cl-activated" name="cl-activated" value='.$metabox['args']['cl-parameter-name'];
  if (get_post_meta($post_id, 'cl-activated', true)==true) {
    echo ' checked="checked"';
  }
  echo ' />';
}

Mes problèmes

  1. les métadonnées de la publication ne sont pas définies. J'ai essayé de chercher les métadonnées dans la table wp-postmeta de la base de données et elles ne sont pas là, peu importe ce que je fais.
  2. Existe-t-il un moyen de sauvegarder les métadonnées même si la publication ou la page est toujours un brouillon et que l'utilisateur clique uniquement sur Enregistrer le brouillon? Si j'utilise l'action save_post comme je le fais maintenant, j'ai l'impression qu'elle n'est appelée que lorsque le message est déjà publié.

Modifier

Le premier problème est résolu. J'ai vérifié les crochets de transition fournis par Wordpress. Il me semblait que le hook save_post devrait être activé lorsque je modifie un article. Cependant, ce qui se passe, c’est qu’il est appelé lorsque je clique sur le bouton nouveau message , mais pas lorsque je sauvegarde ensuite le message en tant que brouillon.

Pour supprimer, j'ai besoin d'un crochet qui me permet d'exécuter une fonction lorsque l'utilisateur a modifié quelque chose sur le message pour voir si ma case personnalisée a été modifiée afin que je puisse mettre à jour les métadonnées du message en conséquence.

2
GorillaPatch

Après WP 2.3, vous avez pour tous les statuts un crochet: {$new_status}_{$post->post_type}

Vous pouvez également utiliser ans if pour le statut de hook save_post; un exemple pour post_type post, vous pouvez remplacer ce post par votre post_type ou par défaut sous WP:

    public function set_status_private($id, $post) {

        if ( is_object($post) && 
             'post' === $post->post_type && 
             'publish' === $post->post_status
            ) {
            $post->post_status = 'private';

            wp_update_post($post);
        }
    }

J'espère que ceci vous aide.

2
bueltge