You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让全局$post支持CPT并更新用户自定义字段浏览计数?

嘿,这个问题很好解决!你只需要调整一下代码里的内容类型判断逻辑,同时优化内容对象的获取方式,就能让计数功能覆盖到你的Recipes和Menus自定义文章类型,还能确保全局$post或者内容对象的可靠性。

解决方案步骤:

  1. 扩展内容类型的判断范围
    原来的代码应该只针对标准文章(post类型)做了判断,现在我们需要把recipes和menus这两个CPT加进去。用is_singular()函数代替is_single(),并传入包含所有目标类型的数组,这样就能匹配单篇标准文章、菜谱和菜单页面。

  2. 可靠获取当前内容对象
    直接依赖全局$post有时候会遇到问题(比如自定义查询覆盖了全局变量),所以推荐用get_queried_object()来获取当前主查询的内容对象,它比全局$post更稳定。如果一定要用全局$post,记得先声明并检查它是否存在。

  3. 更新用户元字段的计数逻辑
    确保在获取作者ID后,正确读取并更新对应的用户自定义字段计数。

完整代码示例:

add_action( 'template_redirect', 'update_author_content_view_count' );
function update_author_content_view_count() {
    // 只在单篇目标内容类型的页面执行
    if ( is_singular( array( 'post', 'recipes', 'menus' ) ) ) {
        // 获取当前主查询的内容对象,替代全局$post更可靠
        $current_content = get_queried_object();
        
        // 如果你一定要用全局$post,可以替换成下面两行:
        // global $post;
        // $current_content = $post;
        
        // 确保内容对象有效且存在作者ID
        if ( $current_content && ! empty( $current_content->post_author ) ) {
            $author_id = $current_content->post_author;
            // 获取当前计数,默认0
            $view_count = get_user_meta( $author_id, 'your_custom_field_key', true );
            $view_count = empty( $view_count ) ? 0 : intval( $view_count );
            
            // 可选:添加防重复计数(同一访客1天内同一内容只算1次)
            $visited_contents = isset( $_COOKIE['visited_contents'] ) ? explode( ',', $_COOKIE['visited_contents'] ) : array();
            if ( ! in_array( $current_content->ID, $visited_contents ) ) {
                // 更新计数
                update_user_meta( $author_id, 'your_custom_field_key', $view_count + 1 );
                
                // 设置Cookie,有效期1天
                setcookie( 
                    'visited_contents', 
                    implode( ',', array_merge( $visited_contents, array( $current_content->ID ) ) ), 
                    time() + 86400, 
                    COOKIEPATH, 
                    COOKIE_DOMAIN 
                );
            }
        }
    }
}

关键说明:

  • 把your_custom_field_key替换成你实际在user_meta中创建的自定义字段键名。
  • is_singular( array(...) )会匹配所有传入的内容类型的单页,完美覆盖你的需求。
  • 可选的Cookie防重复逻辑可以避免同一访客反复刷新导致计数暴涨,如果你不需要这个功能,可以删掉那部分代码。
  • 用template_redirect钩子是因为它在模板加载前触发,确保我们在正确的页面上下文里执行计数更新。

内容的提问来源于stack exchange,提问作者Chazlie

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 10:03:05