首先是什么:WordPress中的wp_head或the_content挂钩?

时间:2018-05-09 16:48:02

标签: php wordpress plugins hook

我正在学习插件。我只想在打开帖子后增加观点。如果我对这些行进行了评论:

//    if(is_single()){
//        $views++;
//    }

我没有看到任何增加。当他们没有被评论时,打开帖子后我立即看到增加。

add_filter('the_content', 'get_views_count');
function get_views_count($content){

    if(is_page()){
        return $content;
    }

    global $post;

    $views = $post->my_count;

//    if(is_single()){
//        $views++;
//    }

    return $content . '<p>Views: ' . $views . '</p>';
}


add_action('wp_head', 'increase_counts');
function increase_counts(){

    if(!is_single()){
        return;
    }

    global $wpdb, $post;

    $views = $post->my_count + 1;

    $query = "UPDATE $wpdb->posts SET my_count=$views WHERE ID=$post->ID";
    $wpdb->query($query);
}

我认为wp_head钩子应该先于the_content。对我来说逻辑更容易:wp_head从db获取计数,增加它并将其写入db。然后the_content只输出结果。如何知道哪个钩子先行?我怎样才能在这个例子中改变他们的优先级?

1 个答案:

答案 0 :(得分:0)

Rachel Vasquez拥有WordPress上最全面的文章之一。你可以在周围找到射击顺序排序的钩子,所以每当你需要知道哪个钩子首先发射时你应该完全检查它:The WordPress Hooks Firing Sequence!

现在,为了回答你的问题,wp_head首先开火。您的代码存在问题:

global $wpdb, $post;

$views = $post->my_count + 1; // HERE!

您正在为$views分配$post->my_count + 1的当前值(例如5 + 1 = 6),但$post->my_count仍然保留其旧值(例如5) )。

如果要显示更新的视图计数,则需要先增加$post->my_count

global $wpdb, $post;

$post->my_count = $post->my_count + 1; // Increment the views count in the $post object first
$views = $post->my_count; // Assign the newly updated views count to the $views variable

这样,当你的get_views_count()函数被调用时,$post对象已经更新,并且已经有正确的视图计数。

<强>除了:

您似乎已更改wp_posts表格以包含my_count列。请不要这样做。

尽可能避免更改核心内容(数据库表和/或WordPress核心文件和文件夹),以确保您使用未来的WordPress版本开发的任何插件或主题的最大兼容性。您希望通过update_post_meta()函数将您的观看数据存储在wp_postmeta表格中。