用于登录用户的按钮点击计数器

时间:2018-12-22 作者:F.A

我是wordpress的新手,正在尝试创建按钮计数器并将单击保存到数据库中。此表单仅适用于wordpress登录用户。

作用php

function getcount($userID){         
    $click_key = \'click_count\';
    $count = get_user_meta($userID, $click_key, true);
    if($count==\'\'){
        delete_user_meta($userID, $click_key);
        add_user_meta($userID, $click_key, \'0\');
        return "0 click";
    }
    return $count.\'click\';
}
function setcount($userID){
    $click_key = \'click_count\';
    $count = get_user_meta($userID, $click_key, true);
    $count++;
    update_user_meta($userID, $click_key, $count);
}
HTML:

<?php
if ( is_user_logged_in() ) {
    $current_user = wp_get_current_user();
    if( isset($_POST[\'clicks\']) ) { 
        setcount($userID);
    }
?>

<form action="<?php echo get_bloginfo(\'home\')?>" method="post">
    <input type="submit" value="click me!" name="clicks">
</form>
    <p>Click Count: <?php echo get_user_meta(\'click_count\', $current_user, true); ?></p>
<?php } ?>

How to count button clicks for each users?

1 个回复
最合适的回答,由SO网友:Tom J Nowell 整理而成

第一个问题不是WP问题,而是对HTML表单工作方式的根本误解。

具体而言,问题在于:

if( isset($_POST[\'clicks\']) ) { 
没有名为的输入clicks, 因此,此值从未设置(因为您从未设置)。

让我们看看您的表单:

<form action="<?php echo get_bloginfo(\'home\')?>" method="post">
    <input type="submit" value="click me!" name="clicks">
</form>
    <p>Click Count: <?php echo get_user_meta(\'click_count\', $current_user, true); ?></p>
<?php } ?>
在这里,它使用POST, 但它从不发送任何信息。唯一的input 标记是提交按钮。需要使用隐藏输入name 属于clicks

第二个问题

$current_user = wp_get_current_user();
if( isset($_POST[\'clicks\']) ) { 
    setcount($userID);
这里,代码获取当前用户,然后传递$userIDsetcount. $userID 虽然没有在任何地方定义,但它没有值,因此PHP默认为null 或空值。这就是为什么即使您成功提交表单,它也无法更新数据库

最后一条提示,如果双击submit按钮,当多个请求尝试增加值时,代码将进入竞争条件。根据服务器的速度、服务器负载以及用户双击的速度,计数将增加,或者增加2而不是1。

因此,在通过javascript单击提交按钮后,请禁用该按钮

相关推荐

Problem in functions.php file

我正在尝试使用functions.php. 以下是我迄今为止所做的工作: <?php function blogroom() { wp_enqueue_style(\'bootstrap\', get_stylesheet_directory_uri() . \'/assets/lib/bootstrap/dist/css/bootstrap.min.css\'); wp_enqueue_style(\'loade