文件写入在Wordpress短代码中多次触发?

时间:2016-07-24 05:15:44

标签: php wordpress

我在Wordpress中使用文本文件编写了一个简单的计数器短代码,我发现它以某种方式触发了多次文件写入过程。

function sc_page_counter() {
    $fname = get_stylesheet_directory() . "/counter.txt";

    if (!file_exists($fname)) {
        file_put_contents($fname, "0");
    }

    $ct = file_get_contents($fname);
    file_put_contents($fname, ++$ct);

    return $ct;
}
add_shortcode('page_counter', 'sc_page_counter');

我已将短代码调用放入footer.php

This site has been visited <?php echo do_shortcode('[page_counter]') ?> times.

假设counter.txt的当前内容为20.短代码将在检查counter.txt文件时正确输出“21”。现在是“25”。无论我是在本地运行还是在生产服务器中运行,结果都会有所不同。

我尝试通过添加一个字符而不是编写新值来进一步测试它,并将其附加大约32次。我目前难以理解为什么会这样。

1 个答案:

答案 0 :(得分:0)

首先,不要使用短代码。第二,写入数据库。

网站浏览量:

functions.php你的主题:

function header_stuff()
{
    $site_views = get_option('site_views');
    update_option('site_views', (((preg_match('#^\d+$#', $site_views)) ? $site_views : 0) + 1));
}
add_action('wp_head', 'header_stuff');

footer.php

This site has been visited <?php echo get_option('site_views') ?> times.

或者,如果您想查看单个帖子/页面页面的视图,可以使用以下内容:

functions.php你的主题:

function header_stuff()
{
    global $post;
    if (is_object($post) && is_singular())
    {
        $post_views = get_post_meta($post->ID, '_views', true);
        update_post_meta($post->ID, '_views', (((preg_match('#^\d+$#', $post_views)) ? $post_views : 0) + 1));
    }
}
add_action('wp_head', 'header_stuff');

输出您需要的地方:

if (is_object($post) && is_singular())
{
    echo 'Views: ' . get_post_meta($post->ID, '_views', true);
}

或者,如果您需要,可以将它们都计算在内:

function header_stuff()
{
    //Site view
    $site_views = get_option('site_views');
    update_option('site_views', (((preg_match('#^\d+$#', $site_views)) ? $site_views : 0) + 1));

    //Post view
    global $post;
    if (is_object($post) && is_singular())
    {
        $post_views = get_post_meta($post->ID, '_views', true);
        update_post_meta($post->ID, '_views', (((preg_match('#^\d+$#', $post_views)) ? $post_views : 0) + 1));
    }
}
add_action('wp_head', 'header_stuff');