如何在wordpress中添加wp nonce到简单的ajax函数

时间:2017-04-17 09:32:17

标签: jquery ajax wordpress

我正在尝试用wp中的ajax创建简单的插件,而我正在为某些人支持的帖子制作“喜欢”这样的按钮

我的问题 1。 我找到了用nonce来保护它的解决方案,但我在谷歌中引用了许多但没有成功。

我查看代码时的链接:

<a class="love-button" href="http://localhost/topaco/wp-admin/admin-ajax.php?action=post_love_add_love&amp;post_id=243" data-id="243">give like for pơst</a>

2。 我可以双击,3次点击,4次点击等等,如果我点击按钮,数字会持续增加。

如何为一个会话限制一次点击或设置用户可以点击以增加数量的时间。

这是我的代码,

php插件文件中的

add_action( 'wp_enqueue_scripts', 'ajax_test_enqueue_scripts' );
function ajax_test_enqueue_scripts() {
    if( is_single() ) {
        wp_enqueue_style( 'love', plugins_url( '/love.css', __FILE__ ) );
    }
    wp_enqueue_script( 'love', plugins_url( '/love.js', __FILE__ ), array('jquery'), '1.0', true );
    wp_localize_script( 'love', 'postlove', array(
        'ajax_url' => admin_url( 'admin-ajax.php' ),
    ));
}
add_filter( 'the_content', 'post_love_display', 99 );
function post_love_display( $content ) {

    //check_ajax_referer( 'thienduc', 'security' );

    $love_text = '';

    if ( is_single() ) {

        $love = get_post_meta( get_the_ID(), 'post_love', true );
        $love = ( empty( $love ) ) ? 0 : $love;

        $love_text = '<p class="love-received"><a class="love-button" href="' . admin_url( 'admin-ajax.php?action=post_love_add_love&post_id=' . get_the_ID() ) . '" data-id="' . get_the_ID() . '">give love</a><span id="love-count">' . $love . '</span></p>'; 
    }
    return  $love_text . $content;
}
add_action( 'wp_ajax_nopriv_post_love_add_love', 'post_love_add_love' );
add_action( 'wp_ajax_post_love_add_love', 'post_love_add_love' );
function post_love_add_love() {
    $love = get_post_meta( $_REQUEST['post_id'], 'post_love', true );
    $love++;
    update_post_meta( $_REQUEST['post_id'], 'post_love', $love );
    if ( defined( 'DOING_AJAX' ) && DOING_AJAX ) { 
        echo $love;
        die();
    }
    else {
        wp_redirect( get_permalink( $_REQUEST['post_id'] ) );
        exit();
    }
}

=============================

和JS文件

jQuery( document ).on( 'click', '.love-button', function() {
    var post_id = jQuery(this).data('id');
    jQuery.ajax({
        url : postlove.ajax_url,
        type : 'post',
        data : {
            action : 'post_love_add_love',
            post_id : post_id,
        },
        success : function( response ) {
            jQuery('#love-count').html( response );
        }
    });

    return false;
})

2 个答案:

答案 0 :(得分:1)

您可以使用以下Cookie:

$cookie_name = "liked-" . get_the_ID();
$cookie_value = get_the_ID();

if(!isset($_COOKIE[$cookie_name])) {
    // Fire like action here and set cookie

setcookie($cookie_name, $cookie_value, time() + (86400 * 30), "/"); // keep it for a month
} else {
    // Do something, if post is already liked
}

答案 1 :(得分:0)

如果您或某人需要有关添加现时的答案。

1-将随机数添加到wp_localize_script:

wp_localize_script( 'love', 'postlove', array(
    'ajax_url' => admin_url( 'admin-ajax.php' ),
    'security' => wp_create_nonce( 'love-nonce' ),
));

2-将check_ajax_referer()添加到您的函数中:

function post_love_add_love() {
  check_ajax_referer( 'love-nonce' );
  // Your code ...
}

3-将随机数添加到JS代码(数据块):

data : {
    action : 'post_love_add_love',
    post_id : post_id,
    security: postlove.security,
},

至于第二部分,您可以使用@Ali_k解决方案。