修改后的答案(PS:其实我很久以前就想修改这个答案,但最终还是忘了修改。)
因此,在这个修改后的答案中,主要的一点是下面的第一点,但我希望其余的也能帮助您:
- 您试图做的事情不可能(轻松地)以ID的存储方式实现,它是序列化的,例如
a:3:{i:0;i:1;i:1;i:10;i:2;i:11;}
(用于array( 1, 10, 11 )
).如果当前用户ID为10,并且在元值中i:10;i:9
, i、 e.键入10的数组项的值(用户ID)为9(即。$some_variable[10] = 9
), 但是ID 10实际上不在列表中?
由于上述原因,您最好创建一个自定义数据库表,并将用户ID和帖子ID存储在它们自己的列中。
如果需要,可以检查简化的example/demo on DB Fiddle.
或者您可以将每个用户ID存储在名为post_is_read
. 这样,过滤帖子就很容易了——但帖子元表最终会非常庞大,有很多很多行。。。
// Saving the meta:
add_post_meta( 1, \'post_is_read\', 10 );
add_post_meta( 1, \'post_is_read\', 11 );
// Then when filtering the posts:
$user_id = 10;
$args = array(
\'meta_key\' => \'post_is_read\',
\'meta_value\' => $user_id,
\'meta_compare\' => \'!=\',
);
$query = new WP_Query( $args );
- 或者您可以使用序列化值,但存储用户名称/登录名,而不是ID:
// Store usernames and not IDs.
$usernames = array( \'foo\', \'user-bar\', \'etc_etc\' );
update_post_meta( 123, \'post_is_read\', $usernames );
然后您可以使用NOT LIKE
类似这样的比较:$username = \'user-bar\';
$args = array(
\'meta_key\' => \'post_is_read\',
\'meta_value\' => \'"\' . $username . \'"\', // search for exactly "<username>" (including the quotes)
\'meta_compare\' => \'NOT LIKE\',
);
$query = new WP_Query( $args );
原始答案
请检查
revisions, 但基本上在我最初的回答中,我是说如果你想使用用户ID,那么你可以将它们存储为逗号分隔的列表,如
1,10,11
然后使用
NOT REGEXP
比较:
// Saving the meta:
update_post_meta( 1, \'post_is_read\', \'1,10,11\' );
// Then when filtering the posts:
$user_id = 10;
$args = array(
\'meta_key\' => \'post_is_read\',
\'meta_value\' => "(^|,)$user_id(,|$)",
\'meta_compare\' => \'NOT REGEXP\',
);
$query = new WP_Query( $args );
这确实(现在仍然)有效(WordPress 5.6.1),但在检索元数据时需要额外的解析,例如:
$ids = get_post_meta( 1, \'post_is_read\', true );
$ids = wp_parse_id_list( $ids ); // convert to array