web-dev-qa-db-fra.com

ne peut pas éditer post_modified dans wp_insert_post (bug?)

Cela ressemble à un bogue, mais ajouter le post_modified dans wp_insert_post ne fonctionne pas:

$wp_test = array(
  'post_title'        => 'test',
  'post_content'      => 'test',
  'post_status'       => 'publish',
  'post_type'         => 'test',
  'post_author'       => 1,
  'post_date'         => '2015-01-22 22:00:12',
  'post_date_gmt'     => '2015-01-22 22:00:12',
  'post_modified'     => '2016-04-18 12:12:12',
  'post_modified_gmt' => '2016-04-18 12:12:12',
  'comment_status'    => 'closed'
);
$wp_id = wp_insert_post( $wp_test );

La date post_modified ne fonctionne pas et a la même valeur que post_date, mais pas celle souhaitée '2016-04-18 12:12:12'. Est-ce un bug? J'utilise wp 4.5 (thème de vingt-six ans). Je l'ai corrigé en utilisant le code suivant, mais je pense que cela pourrait être plus pratique ...

$wp_test = array(
  'post_title'        => 'test',
  'post_content'      => 'test',
  'post_status'       => 'publish',
  'post_type'         => 'test',
  'post_author'       => 1,
  'post_date'         => '2015-01-22 22:00:12',
  'post_date_gmt'     => '2015-01-22 22:00:12',
  'comment_status'    => 'closed'
);
$wp_id = wp_insert_post( $wp_test );

// ugly fix
$wpdb->query( "UPDATE $wpdb->posts SET post_modified = '2016-04-18 12:12:12',post_modified_gmt = '2016-04-18 12:12:12' WHERE ID = $wp_id");
4
Gijs

Ce n'est pas un bogue, en fait, WordPress n'autorise pas (à l'aide d'arguments) la définition d'une date post-modification. En interne, WordPress la définit à l’heure actuelle si vous mettez à jour une publication existante, sinon définissez-la simplement comme date de publication.

dans /wp-includes/post.php#L3192 vous pouvez voir que wp_insert_post n'utilise pas cet argument

if ( $update || '0000-00-00 00:00:00' == $post_date ) {
        $post_modified     = current_time( 'mysql' );
        $post_modified_gmt = current_time( 'mysql', 1 );
} else {
        $post_modified     = $post_date;
        $post_modified_gmt = $post_date_gmt;
}

La documentation ne me semble pas correcte. J'ai créé un ticket # 36597 pour cela. Espérons que la documentation sera corrigée.

PS: Cependant, vous pouvez utiliser wp_insert_post_data filter pour définir votre date de modification personnalisée.

EDIT: WordPress exécutant déjà une requête d’insertion, puis une autre requête SQL juste pour mettre à jour l’heure de la post-modification n’est pas une bonne idée. Il est préférable de modifier la date juste avant que WordPress l’insère dans la base de données. Je pense que cela ne vous coûtera pas beaucoup plus cher qu'une requête SQL séparée.

Commencez par ajouter un filtre juste avant wp_insert_post et supprimez-le pour ne pas affecter d'autres fonctions d'insertion.

add_filter( 'wp_insert_post_data', 'alter_post_modification_time', 99, 2 );
$wp_id = wp_insert_post( $wp_test );
remove_filter( 'wp_insert_post_data', 'alter_post_modification_time', 99, 2 );

Dans la fonction de rappel, définissez l'heure de modification à laquelle nous avons passé les arguments de la fonction wp_insert_post(). (N'oubliez pas d'ajouter l'heure de post-modification que vous avez supprimée des arguments)

function alter_post_modification_time( $data , $postarr ) {
    if (!empty($postarr['post_modified']) && !empty($postarr['post_modified_gmt'])) {
        $data['post_modified'] = $postarr['post_modified'];
        $data['post_modified_gmt'] = $postarr['post_modified_gmt'];
    }

    return $data;
}
7
Sumit