web-dev-qa-db-fra.com

Est-il possible de créer un post en utilisant une metabox?

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).

Code

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!

1
mor7ifer

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.

1
mor7ifer

Mettre à jour

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…

Ancienne réponse

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.
}
2
fuxia

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é

0
hacksy