我正在建立wordpress网站,它可以选择从特定的自定义帖子类型下载zip文件。通过单击下载按钮,用户自动开始下载zip文件。
<a id="countable_link" href="#">download</a>
我的目标是在同一个按钮旁边显示下载次数。到目前为止,一切都很好,除了我能够无限次触发计数器。
相反,我希望计数器只能由唯一用户执行一次。我假设这与用户的ip地址有关,但我对PHP、SQL和ajax的知识非常贫乏。
这是我找到的脚本:(它也已经发布了here)
<?php
if ( is_admin() ) add_action( \'wp_ajax_nopriv_link_click_counter\', \'link_click_counter\' );
function link_click_counter() {
if ( isset( $_POST[\'nonce\'] ) && isset( $_POST[\'post_id\'] ) && wp_verify_nonce( $_POST[\'nonce\'], \'link_click_counter_\' . $_POST[\'post_id\'] ) ) {
$count = get_post_meta( $_POST[\'post_id\'], \'link_click_counter\', true );
update_post_meta( $_POST[\'post_id\'], \'link_click_counter\', ( $count === \'\' ? 1 : $count + 1 ) );
}
exit();
}
add_action( \'wp_head\', \'link_click_head\' );
function link_click_head() {
global $post;
if( isset( $post->ID ) ) {
?>
<script type="text/javascript" >
jQuery(function ($) {
var ajax_options = {
action: \'link_click_counter\',
nonce: \'<?php echo wp_create_nonce( \'link_click_counter_\' . $post->ID ); ?>\',
ajaxurl: \'<?php echo admin_url( \'admin-ajax.php\' ); ?>\',
post_id: \'<?php echo $post->ID; ?>\'
};
$( \'#countable_link\' ).on( \'click \', function() {
var self = $( this );
$.post( ajax_options.ajaxurl, ajax_options, function() {
window.location.href = self.attr( "href" );
});
return false;
});
});
</script>
<?php
}
}
?>
当我将此代码片段放入函数时。php文件,它会生成具有精确点击次数的自定义字段值。如果这些数字更现实一些,那就太好了。例如,如果它显示的值为350,人们真的想知道有350个不同的用户下载了内容。
除了使用其他插件之外,我非常感谢任何解决方案。如果能以某种方式整合到这个片段中,它最终将成为我的完美选择。
谢谢
SO网友:kaiser
如果用户使用代理并随机化其IP地址,您会怎么做?有许多浏览器插件可以简化这一过程,只需点击一个按钮即可多次下载。饼干也是如此。除此之外,您还试图收集能够识别用户的数据,这在许多国家是非法的。
更好的方法是添加一个一次性散列,作为post元数据。发布帖子期间添加此类哈希的示例—在本例中,md5将帖子日期哈希为UNIX时间戳:
add_action( \'draft_to_publish\', function( \\WP_Post $post )
{
add_post_meta(
$post->ID,
\'download_hash\',
md5( date( \'U\', $post->post_date ),
true
);
} );
(您可以任意构造哈希)。
然后,当用户下载文件时,只需设置一个用户元值,将该哈希作为键,值为1
/true
/foo
. 下载后,您只需检查当前download_hash
已经是用户元值,然后可以拒绝下载。
要实现计数器,只需添加另一个名为download_users
您可以在其中保存一组用户ID。完成。