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");
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;
}