因此,我正在try 根据我的帖子列表进行过滤.到目前为止,我有一个函数,它可以将看到任何给定帖子的任何用户保存到一个名为‘Loged_Viewers’的元域中,并且我已经验证了它是有效的,因为我可以在帖子内容中打印出它的内容

我正在使用带有自定义查询ID的Elementor循环格网

下面的代码应该只显示当前用户没有看到的帖子,但它不起作用,我似乎找不出原因

function query_by_seen( $query ) {

    // Get current meta Query
    $meta_query = $query->get( 'meta_query' );
    // Get meta data
    $userID = get_current_user_id();
    $viewers_list = get_post_meta( $post->ID, 'logged_viewers', true );

    // If there is no meta query when this filter runs, it should be initialized as an empty array.
    if ( ! $meta_query ) {
        $meta_query = [];
    }

    // Append our meta query
    $meta_query[] = [
        'key' => $viewers_list,
        'value' => $userID,
        'compare' => 'NOT IN',
    ];

    $query->set( 'meta_query', $meta_query );

}
add_action( 'elementor/query/query_by_seen', 'query_by_seen' );

以下代码填充logged_viewers字段:

function log_viewers() {
        global $post;
    
        $viewers_nonce  = wp_create_nonce( 'viewers_nonce_' . $post->ID );
        $userID         = get_current_user_id();
        $viewers        = get_post_meta( $post->ID, 'logged_viewers', true );  
        
        if( empty( $viewers ) ) {
            $viewers = array();
        }
    
        $viewers[]      = $userID;
        $viewers_list   = array_unique( $viewers );
    
        if( !wp_verify_nonce( $viewers_nonce, 'viewers_nonce_' . $post->ID ) ) {
            die();
        }
        else {
            update_post_meta( $post->ID, 'logged_viewers', $viewers_list );
        }
}
add_action( 'wp_head', 'log_viewers' );

我是PHP的新手,所以我可能会错过一些东西,但如果有任何帮助,我将不胜感激

推荐答案

根据the documentation for WP_Query,当使用NOT IN时,value应该是一个array.这意味着比较从元数据中获取值,并将其与提供的数组中的值进行比较:

Value(字符串|数组)-自定义字段值.只有当COMPARE为‘IN’、‘NOT IN’、‘BETWEEN’或‘NOT BETWEEN’时,它才能是array.

这意味着将一个整数传递给value并且元数据是一个数组将不起作用.我用这个方案测试了几种方法,但没有一种方法能正常工作.

有效的方法是存储用户在用户元数据中看到的帖子的ID,然后与之进行比较.

add_action( 'wp_head', static function () {
    if ( ! is_single() ) {
        return;
    }

    $user_id = get_current_user_id();
    $post_id = get_queried_object_id();
    $viewed  = get_user_meta( $user_id, 'viewed_ids' );

    if ( in_array( $post_id, $viewed ) ) {
        return;
    }

    add_user_meta( $user_id, 'viewed_ids', $post_id );
} );

function query_by_seen( $query ) {
    $user_id      = get_current_user_id();
    $viewed       = get_user_meta( $user_id, 'viewed_ids' );
    $post__not_in = $query->get( 'post__not_in', array() );

    $post__not_in = array_merge( $post__not_in, $viewed );
    $post__not_in = array_unique( $post__not_in );

    $query->set( 'post__not_in', $post__not_in );
} );

如果你需要知道哪些用户在帖子上看了,那么在add_user_meta()之后的wp_head个回调中加上:

add_action( 'wp_head', static function () {
    ...

    add_user_meta( ... );

    $viewed = get_post_meta( $post_id, 'logged_viewers' );

    if ( in_array( $user_id, $viewed ) ) {
        return;
    }

    add_post_meta( $post_id, 'logged_viewers', $user_id );
} );

Php相关问答推荐

此行动未经授权.升级Laravel时

模型中的Laravel自定义查询字段

Symfony Api平台:按自定义实体方式排序结果

使用WordPress wp_mail()的邮箱标题无效

无法在WooCommerce中发送客户笔记邮箱通知

为什么正则表达式与得到的文本块之前得到的也行?

将文件添加到存档,而不重建存档

在PHP中处理Linux输入事件(/dev/input/Event*)

如何将LARAVEL模块路径和项目路径合并,因为当我使用模块路径时,它们会覆盖项目路径

在WooCommerce中只允许高价产品的BACS付款

向WooCommerce管理订单总额添加自定义总额行

在WooCommercestore 页面上显示库存产品属性的值

Mockery在模拟Redis连接时抛出错误:Mockery\Exception\BadMethodCallException

如何在 apache Laragon - laravel 10 中允许方法 DELETE?

MongoDB Laravel Jenssegers 包:插入数据库时​​未定义的类常量PRIMARY

由于 PHP 版本不受支持,如何终止 PHP 脚本?

尽管有use指令,PHP 类在其他文件中仍处于可见状态

Laravel 测试 assertJsonMissing 不适用于唯一的键.为什么?

路由未定义的 laravel 导出

多排序子数组 - 包含范围数据的子数组