web-dev-qa-db-fra.com

Mise à jour par lots d'une valeur de champ de méta de publication de chaque publication dans Type de publication

J'ai besoin d'aide pour créer un lot post meta updater que j'essaie d'ajouter à ma page des options/paramètres.

Fondamentalement, je cherche un moyen de cliquer sur un bouton, un lot parcourt toutes les publications d'un "listing" CPT sélectionné, met à jour un champ méta et exécute une fonction.

Mon code est-il correct? Et comment puis-je ajouter un bouton qui ne rafraîchira pas la page, mais lancera cette fonction.

function batch_update_meta(){

        $post_type = "listings";
        $post_type_object = get_post_type_object($post_type);
        $label = $post_type_object->label;
        echo  All . "$label";
        $posts = get_posts(array('post_type'=> $post_type, 'post_status'=> 'publish', 'suppress_filters' => false, 'posts_per_page'=>-1));

        foreach ($posts as $post) {

            $meta_value1 = get_post_meta($post->ID, $key1, True);

            if (!empty($meta_value1)){

            $meta_value2 = media_process($meta_value1, $post->ID); //Returns a string after it finishes process.
            update_post_meta($post->ID, $key2, $meta_value2)
            echo $post->post_title." UPDATED"; //Prints updated after ran.

            }
        }

   }
1
samjco

Jetez un coup d'œil à la documentation AJAX , il existe de nombreux exemples sur ce site et sur Google pour déclencher un événement sur le serveur sans actualiser la page.

Dans ce cas, WP écoute un appel AJAX ressemblant à http://example.com/wp-admin/admin-ajax.php?action=wpse20160318_batch_update. Une fois déclenché, votre processus de traitement par lots générera un message JSON pouvant être utilisé par JavaScript une fois l'appel terminé.

Les principales modifications consistent simplement à ajouter un écouteur AJAX pour déclencher le batch_update_meta, à supprimer toutes les echos et à renvoyer le code JSON une fois l'opération terminée.

function batch_update_meta() {

    $post_type        = "listings";
    $post_type_object = get_post_type_object( $post_type );
    $label            = $post_type_object->label;
    $processed = array ();

    $posts = get_posts( array (
        'post_type'        => $post_type,
        'post_status'      => 'publish',
        'suppress_filters' => false,
        'posts_per_page'   => - 1,
    ) );

    foreach ( $posts as $post ) {

        $key1 = 'my_meta_key_1';
        $key2 = 'my_meta_key_2';

        $meta_value1 = get_post_meta( $post->ID, $key1, true );

        if ( ! empty( $meta_value1 ) ) {

            // Returns a string after it finishes process.
            $meta_value2 = media_process( $meta_value1, $post->ID );

            // Update the meta
            update_post_meta( $post->ID, $key2, $meta_value2, $meta_value1 );

            // Add to our success list
            $processed[] = $post->post_title;
        }
        else {
            //...
        }
    }

    // give a response for AJAX
    wp_send_json_success( array (
        'label'     => $label,
        'processed' => $processed,
        'message'   => 'Batch Completed.',
    ) );
}

// callback for AJAX function
function wpse20160318_batch_update_meta() {

    // run your batch update
    batch_update_meta();
}

// must be logged in to trigger - http://example.com/wp-admin/admin-ajax.php?action=wpse20160318_batch_update
add_action( 'wp_ajax_wpse20160318_batch_update', 'wpse20160318_batch_update_meta' );
3
jgraup