如何让全局$post支持CPT并更新用户自定义字段浏览计数?
嘿,这个问题很好解决!你只需要调整一下代码里的内容类型判断逻辑,同时优化内容对象的获取方式,就能让计数功能覆盖到你的Recipes和Menus自定义文章类型,还能确保全局$post或者内容对象的可靠性。
解决方案步骤:
扩展内容类型的判断范围
原来的代码应该只针对标准文章(post类型)做了判断,现在我们需要把recipes和menus这两个CPT加进去。用is_singular()函数代替is_single(),并传入包含所有目标类型的数组,这样就能匹配单篇标准文章、菜谱和菜单页面。可靠获取当前内容对象
直接依赖全局$post有时候会遇到问题(比如自定义查询覆盖了全局变量),所以推荐用get_queried_object()来获取当前主查询的内容对象,它比全局$post更稳定。如果一定要用全局$post,记得先声明并检查它是否存在。更新用户元字段的计数逻辑
确保在获取作者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
相关产品推荐
相关产品推荐

