首页 > 解决方案 > Wp_Query 中的最大数组长度 post__not_in 参数

问题描述

我正在使用 WordPress 上的页面向本地 php 文件发出发布请求,以促进无限滚动。WP_query 每次的参数如下:

$args =  array(
            'post_status' => 'publish',
            'post_type' =>  array( 'post'),
            'post__not_in' => $_POST["LoadedIDs"],
            'posts_per_page' => $numberofResources,
            'orderby'  => 'rand',
            'meta_query' => array(
                array(
                 'key' => 'shares',
                 'value' => 100,
                 'compare' => '>=',
                 'type' => 'numeric',
                ),
            )
    );

LoadedIDs 是已经获取的 ID 列表,因此在每次请求之后自然会变长。最终我注意到我得到了重复。我认为这是由于 post__not_in 数组长度的限制。请问有人知道那是什么吗?

标签: wordpresspost

解决方案


您应该对此进行概要分析以查看需要多长时间。如果您有大量的帖子(比如说 5-50k),那么查询可能需要一些时间来执行,而且针对已经加载的帖子进行测试也可能很耗时。

另外,我假设加载的 ID 是从客户端发送的。如果是这种情况,并且帖子数量非常多,那么您可能会遇到与将数据从客户端获取到服务器有关的问题。您应该检查 $_POST 以确保所有 ID 都存在。如果你有太多的 ID,那么你可能不得不求助于将加载的 ID 存储在会话中,但如果做得不好,这可能会变得混乱。

无论如何,这个尝试:

$exclude = is_array( @$_POST['LoadedIDs'] ) ? $_POST['LoadedIDs'] : [];

// use array keys for faster lookup
$_exclude = array_flip( $exclude );

$all_posts = get_posts( [
    'post_status'    => 'publish',
    'post_type'      => [ 'post' ],
    'posts_per_page' => - 1,
    'orderby'        => 'rand',
    'meta_query'     => array(
        array(
            'key'     => 'shares',
            'value'   => 100,
            'compare' => '>=',
            'type'    => 'numeric',
        ),
    )
]);

// get the next X number of posts.
$next_posts = array_slice( array_filter( $all_posts, function ( $p ) use( $_exclude ){
    return ! isset( $_exclude[$p->ID] );
} ), 0, $numberofResources );

推荐阅读