J'essaie de créer une publication (enfin, plusieurs publications) à partir d'une métabox à l'aide du hook 'save_post'. J'ai exécuté le script une fois, créant environ 3900 nouvelles publications avant de m'immiscer dans posts.php et de découvrir que wp_insert_post () appelle le hook 'save_post'. Quelqu'un at-il une solution créative autour de cela pour créer le poste sans faire une insertion directe de base de données (le moins hacky la solution est la meilleure).
add_action( 'add_meta_boxes', 'my_metabox_init' );
add_action( 'save_post', 'my_metabox_save' );
function my_metabox_init()
{
add_meta_box(
'my-metabox',
'My Metabox',
'my_metabox_render'
'post',
'normal',
'core'
);
//enquque scripts and styles
}
function my_metabox_render() {
//generate datasets
}
function my_metabox_save() {
//data authenticity check
//process & sanitize data
//create posts
for( $i=0; $i<$count; $i++ ) {
$args = array(
'post_status' => 'pending',
'post_title' => $_POST['post_title'][$i],
'post_type' => 'custom_post_type',
);
foreach( $category_array[$i] as $category ) {
$args['tax_input']['custom-taxonomy'][] = $category;
}
if( $_POST['id_of_previously_created_post'][$i] != '' ) {
$args['ID'] = $_POST['id_of_previously_created_post'][$i];
unset( $args['post_status'] );
}
$new_post_id = wp_insert_post( $args );
}
}
Merci!
Je l'ai compris, ce que j'ai fini par faire était le suivant:
function my_metabox_save() {
//do this just once
if( MY_DOING_SAVE != 'my_doing_save' ) {
define( MY_DOING_SAVE , 'my_doing_save' );
//data authenticity check
//process & sanitize data
//create posts
for( $i=0; $i<$count; $i++ ) {
$args = array(
'post_status' => 'pending',
'post_title' => $_POST['post_title'][$i],
'post_type' => 'custom_post_type',
);
foreach( $category_array[$i] as $category ) {
$args['tax_input']['custom-taxonomy'][] = $category;
}
if( $_POST['id_of_previously_created_post'][$i] != '' ) {
$args['ID'] = $_POST['id_of_previously_created_post'][$i];
unset( $args['post_status'] );
}
$new_post_id = wp_insert_post( $args );
}
}
}
La raison pour laquelle la méthode de @ toscho n'a pas fonctionné tient à la portée de la variable. Il était cependant sur la bonne voie.
La réponse est si simple, je ne pouvais pas le voir au début. :)
Supprimez simplement l'action lors du premier appel de fonction. De cette façon, votre travail au sein de l'API , et votre fonction est appelée une seule fois. Pas besoin de variables ou de constantes statiques ou même globales.
function my_metabox_save() {
remove_action( 'save_post', 'my_metabox_save' );
// go on with your function ...
Je vais laisser l’ancienne réponse illustrer à quel point une solution peut être délicate si vous pensez trop abstraite…
Ajoutez une coche à my_metabox_save()
pour éviter un second appel.
Exemple de code (non testé):
function my_metabox_save() {
static $done = FALSE;
if ( $done )
{ // No, not again!
return;
}
//data authenticity check
//process & sanitize data
//create posts
for( $i=0; $i<$count; $i++ ) {
$args = array(
'post_status' => 'pending',
'post_title' => $_POST['post_title'][$i],
'post_type' => 'custom_post_type',
);
foreach( $category_array[$i] as $category ) {
$args['tax_input']['custom-taxonomy'][] = $category;
}
if( $_POST['id_of_previously_created_post'][$i] != '' ) {
$args['ID'] = $_POST['id_of_previously_created_post'][$i];
unset( $args['post_status'] );
}
$new_post_id = wp_insert_post( $args );
}
$done = TRUE; // Remember that we’re done.
}
Vous pouvez simplement ajouter une vérification wp_nonce avant d’enregistrer la publication http://codex.wordpress.org/Function_Reference/wp_nonce_field wp_nonce sera désagrégé et aucun appel à wp_insert_post ne sera effectué