wake-up-neo.com

Batch-Aktualisierung eines Post-Meta-Feldwerts für jeden Post in Post Type

Ich benötige Hilfe bei der Erstellung eines Batch-Post-Meta-Updaters, den ich meiner Options-/Einstellungsseite hinzufügen möchte.

Grundsätzlich suche ich nach einer Möglichkeit, auf eine Schaltfläche zu klicken, mit der ein Stapel durch alle Posts eines ausgewählten CPT- "Listings" geführt und ein Metafeld aktualisiert sowie eine Funktion ausgeführt wird.

Schaut mein Code richtig? Und wie füge ich eine Schaltfläche hinzu, die die Seite nicht aktualisiert, diese Funktion jedoch startet?.

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

Schauen Sie sich die Dokumentation AJAX an. Auf dieser Site und in den Google-Dokumenten finden Sie zahlreiche Beispiele, mit denen Sie ein Serverereignis auslösen können, ohne die Seite zu aktualisieren.

In diesem Fall hört WP einen AJAX -Aufruf, der wie http://example.com/wp-admin/admin-ajax.php?action=wpse20160318_batch_update aussieht. Wenn es ausgelöst wird, durchläuft es Ihren Batch-Prozess und gibt eine JSON-Nachricht aus, die nach Abschluss des Aufrufs von JavaScript verarbeitet werden kann.

Die wichtigsten Änderungen sind das Hinzufügen eines AJAX Listeners, um den batch_update_meta auszulösen, echos zu entfernen und JSON zurückzugeben, wenn der Vorgang abgeschlossen ist.

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