web-dev-qa-db-fra.com

Une publication est enregistrée deux fois ou plus lors de add_action (save_post)

J'ai ajouté une méta-boîte personnalisée contenant des informations avancées pour une catégorie de message spécifique sur la page de création d'un nouveau message.

Maintenant, je reconnais que si je sauvegarde le post, il écrit 2 entrées dans la base de données avec 2 post_ids.

add_action( 'add_meta_boxes', 'my-plugin_add_custom_box' );
add_action( 'save_post', 'my-plugin_save_postdata' );

my-plugin
function my-plugin_add_custom_box() {
    add_meta_box( 
        'my-plugin_sectionid',
        __( 'my-plugin', 'my-plugin_textdomain' ),
        'my-plugin_inner_custom_box',
        'post' 
    );
}

/* When the post is saved, saves our custom data */
function my-plugin_save_postdata( $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;

  // verify this came from the our screen and with proper authorization,
  // because save_post can be triggered at other times

  if ( !wp_verify_nonce( $_POST['my-plugin_noncename'], plugin_basename( __FILE__ ) ) )
      return;


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

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

    //$mydata = $_REQUEST['sports'];
    print($post_id); //prints two post ids e.g. 831 & 832
    //print($mydata); //prints two times content of $mydata
}

Pourquoi deux enregistrements dans les tables wp_posts sont-ils créés? Et lorsque je mets à jour le message, un nouvel enregistrement est créé avec post_name post_id-revision (843-révision). Quels sont les avantages de créer un nouveau type de message, comme sports pour ce type de message? Mes informations avancées telles que $_REQUEST['sports']; sont prévues pour être stockées dans une base de données séparée avec une référence à wp_posts.

Merci d'avance & BR,

mybeck

3
mybecks

L'un des deux ID peut être une post-révision. Pour éviter ce problème, j'ai toujours cette vérification dans ma fonction save_postdata:

// Autosave, do nothing
if ( defined( 'DOING_AUTOSAVE' ) && DOING_AUTOSAVE ) 
        return;
// AJAX? Not used here
if ( defined( 'DOING_AJAX' ) && DOING_AJAX ) 
        return;
// Check user permissions
if ( ! current_user_can( 'edit_post', $post_id ) )
        return;
// Return if it's a post revision
if ( false !== wp_is_post_revision( $post_id ) )
        return;

Comme vous pouvez le constater, la dernière condition que j'utilise ici vérifie la post-révision. Essayez de l'utiliser aussi dans votre fonction.

7
swissspidy

Un Exemple pour lire comment.

Dans la fonction my-plugin_save_postdata()do vous devez mettre à jour les métadonnées, utilisez la fonction update_post_meta() pour le faire, pas plus; seul le $_POST est vrai. En outre, WP enregistre une nouvelle entrée dans la base de données, si vous n'avez pas désactivé la révision. Toutes les mises à jour d'une publication, y compris la sauvegarde automatique, créent une nouvelle publication avec un nouvel identifiant. Vous pouvez supprimer ce comportement via une constante dans le wp-config.php - define( 'WP_POST_REVISIONS', FALSE );

1
bueltge