wake-up-neo.com

Aktualisiere Metawerte mit AJAX

Ich arbeite an einem Abstimmungssystem in Wordpress. Ich habe es zuerst mit GET Anfragen gemacht, aber jemand hat mir gesagt Sie sollten GET nicht dafür verwenden , also habe ich angefangen, mit AJAX zu arbeiten, um benutzerdefinierte Felder/Meta-Werte zu aktualisieren, nachdem ich dieser Artikel . Ich habe eine Menge Dokumentation von jQuery und Wordpress AJAX Seiten gelesen, mit denen ich jetzt arbeite.

Ich glaube, ich bin auf einem guten Weg, aber es fehlt etwas/oder ich mache etwas falsch.

Die Abstimmungsfunktion funktioniert einwandfrei, da ich dies zuvor mit den GET-Anforderungen getestet habe.

Ich habe dieses einfache HTML-Testformular:

<form id="vote_form" method="post">
    <input type="hidden" id="id" name="id" value="810">
    <input type="hidden" id="post_id" name="post_id" value="811">
    <input type="submit">
</form>

Ich habe diese jQuery-Datei in meiner header.php enthalten und natürlich die jQuery-Bibliothek selbst enthalten.

jQuery(document).ready(function() {

    jQuery( "#vote_form" ).submit( function( event ) {

        event.preventDefault();

        var id = jQuery("#vote_form #id").val();
        var post_id = jQuery("#vote_form #post_id").val();
        var vote = 'up';

        jQuery.ajax({
            type: "POST",
            url: stn_vote.ajaxurl,
            data: { 
                id: id, 
                post_id: post_id,
                vote: vote, 
                action: 'stn_voting' 
            },

        }); 

    });

});

Und meine Abstimmungsfunktion ist in die Aktion wp_ajax eingebunden.

    // Ajax Voting
wp_register_script( 'ajax-vote', get_template_directory_uri() . '/js/ajax-vote.js', array('jquery') );

$nonce = wp_create_nonce("vote_nonce");
$stn_vote_data = array(
    'ajaxurl' => admin_url( 'admin-ajax.php'),
    'nonce' => $nonce,
);
wp_localize_script( 'ajax-vote', 'stn_vote', $stn_vote_data );

function stn_script_enqueuer() {    
    wp_enqueue_script( 'jquery' );
    wp_enqueue_script( 'ajax-vote' );

}
add_action( 'wp_enqueue_scripts', 'stn_script_enqueuer' );

        // Vote Up
        if( isset( $_POST['id'] ) ) {

            //simple Security check
            if ( ! wp_verify_nonce( $_POST['nonce'], 'vote_nonce' ) )
                die ( 'Busted!');

            if( isset( $_POST['post_id'] ) ) {
                $post_id =  $_POST['post_id'];
            }

            if( $_POST['vote'] == 'up' ) {

                $vote_id = $_POST['id'];
                $key = 'vote_up_' . $post_id;
                $vote_up = get_post_meta( $vote_id, $key, true );
                $value = $vote_up + 1;
                $update_vote_up = update_post_meta( $vote_id, 'vote_up_' . $post_id, $value );

                // Update vote count
                $vote_count = get_post_meta( $vote_id, 'vote_count_' . $post_id, true );
                $value = $vote_count + 1;
                $update_vote_count = update_post_meta( $vote_id, 'vote_count_' . $post_id, $value );

                // Update vote percent
                $vote_percent = ( ( $vote_up + 1) / ( $vote_count + 1 ) ) * 100;
                update_post_meta( $vote_id, 'vote_percent_' . $post_id, $vote_percent );

            }

            // Vote Down
            else {          
                $vote_id = $_POST['id'];
                $key = 'vote_down_' . $post_id;
                $vote_down = get_post_meta( $vote_id, $key, true );
                $value = $vote_down + 1;
                $update_vote_down = update_post_meta( $vote_id, 'vote_down_' . $post_id, $value );

                // Update vote count
                $vote_count = get_post_meta( $vote_id, 'vote_count_' . $post_id, true );
                $value = $vote_count + 1;
                $update_vote_count = update_post_meta( $vote_id, 'vote_count_' . $post_id, $value );

                // Update vote percent
                $key = 'vote_up_' . $post_id;
                $vote_up = get_post_meta( $vote_id, $key, true );
                $vote_percent = ( $vote_up / ( $vote_count + 1 ) ) * 100;
                update_post_meta( $vote_id, 'vote_percent_' . $post_id, $vote_percent );

            }
        }
        die();

    }
    add_action('wp_ajax_stn_voting', 'ajax_stn_voting');
    add_action('wp_ajax_nopriv_stn_voting', 'ajax_stn_voting');
2
Robbert

Ein paar Dinge:

1: Wenn Sie das Skript nach jquery einfügen, lokalisieren Sie es mit der Funktion wp_localize_script :

$nonce = wp_create_nonce("vote_nonce");
$yourscript_info = array(
    'ajaxurl' => admin_url( 'admin-ajax.php'),
    'nonce' => $nonce
);
wp_localize_script( 'yourscript', 'yourscript', $yourscript_info );

$.ajax({
    type: "POST",
    url: yourscript.ajaxurl,
    data: { id: id, vote: vote, nonce: yourscript.nonce, action: "stn_voting" },

2: Fügen Sie einige Sicherheitsüberprüfungen mit nonce hinzu:

function ajax_stn_voting() {
    //simple Security check
    if ( ! wp_verify_nonce( $_POST['nonce'], 'vote_nonce' ) )
        die ( 'Busted!');

3: Sie müssen die Beitrags-ID nicht in die Metaschlüssel aufnehmen. Es ist bereits an den Beitrag angehängt, also bereits in der Datenbank gespeichert.

$key = 'vote_up';
instead of
$key = 'vote_up_' . $post->ID;

Nicht nur die vote_up-Taste, sondern alle _ '. $ post-> ID; Teil ist in der Funktion nicht erforderlich. Wenn alle Ihre Schlüssel unterschiedlich sind, können Sie die Posts nicht anhand dieser Werte bestellen, und es ist einfach unnötig, dies zu tun.

4: Sie müssen am Ende der Funktion "sterben", wenn Sie Ajax verwenden:

    die();
}
add_action('wp_ajax_stn_voting', 'ajax_stn_voting');
add_action('wp_ajax_nopriv_stn_voting', 'ajax_stn_voting');

Ansonsten sieht das Drehbuch für mich gut aus.

Und was G. M. in den Kommentaren oben gesagt hat :)

2
passatgt

Ihr benutzerdefiniertes Skript verwendet $ und berücksichtigt daher nicht den Modus "noConflict".

Verwenden Sie einen korrekten, konfliktfreien Wrapper oder ersetzen Sie "$" überall durch "jQuery".

Weitere Informationen: http://codex.wordpress.org/Function_Reference/wp_enqueue_script#jQuery_noConflict_Wrappers

Die Verknüpfung $ ist nicht in allen Kontexten gültig. Sie müssen die Verwendung beenden, wenn dies möglich ist, oder sie mithilfe eines Wrappers wie in diesem Link beschrieben definieren.

0
Otto