WP Query 'posts_per_page'

时间:2017-08-14 作者:Влад

我有一个自定义的帖子类型ClinicsDoctors. 每个诊所都有自己的clinic\\u id(通过自定义字段)。每个医生都有相同的领域clinic_id 他工作的诊所很多。

我需要穿上single-clinic.php 显示在此工作的所有医生(将医生的clinic\\u id与当前页面的clinic\\u id进行比较)。

为此,我创建了新WP_Query 对象和所有医生的列表,然后如果clinic\\u id(在clinic页上)==clinic\\u id(在doctors页上),则显示他们。

问题是有很多医生(超过5k页),所以当我尝试设置\'posts_per_page\' => -1 它不起作用了。

$args = array(
            \'posts_per_page\' => -1,
            \'post_type\' => \'doctors\',
            \'orderby\' => "ID",
            \'nopaging\' => true
        );
$listDoctors = new WP_Query($args);
你知道怎么做吗?

2 个回复
最合适的回答,由SO网友:Tom J Nowell 整理而成

您可以添加必要的参数,以仅请求具有相关诊所ID的帖子。

e、 g。

$q = new WP_Query( [
    \'post_type\'  => \'doctors\',
    \'meta_key\'   => \'clinic_id\',
    \'meta_value\' => get_queried_object_id(),
] );
然而,您在数据结构的设计方式上有一个根本性的错误。可过滤字段应该存储为术语/分类法,而不是post meta。

当你已经知道帖子的ID,但你不知道这里的ID,这就是你要查询的内容时,Post meta的构建速度是非常快的。这将生成此查询extremely expensive and slow. 如果没有一个很好的缓存系统,服务器将在中等甚至轻负载的情况下运行,并且如果您访问数千个帖子(包括所有类型的帖子,而不仅仅是医生),可能会出现更多的根本问题。

相反,使用分类法存储诊所ID,其中术语slug是ID。不要使用post-meta。

Here is code that will automatically create the term when a clinic is created:

add_action( \'save_post\', function ( $post_id, $post ) {
    $post_type = get_post_type( $post_id );

    // If this isn\'t a \'clinic\' post, skip
    if ( \'clinic\' != $post_type ) {
        return;
    }
    wp_insert_term( $post->post_title, \'clinics\', [
        \'slug\' => $post_id
    ]);
} );

This will delete the term when the clinic is deleted:

add_action( \'before_delete_post\', function ( $post_id ) {
    $post_type = get_post_type( $post_id );

    // If this isn\'t a \'clinic\' post, skip
    if ( \'clinic\' != $post_type ) {
        return;
    }
    $term = get_term_by( \'slug\', strval( $post_id ) ,\'clinics\' );
    if ( false !== $term ) {
        wp_delete_term( $term_id, \'clinics\' );
    }
} );

This function will convert a post from post meta to using the taxonomy:

function wpse276842_convert_clinic_meta_to_terms( $post_id ) {
    $clinic_ids = get_post_meta( $post_id, \'clinic_id\', false );
    if ( empty( $clinic_ids ) ) {
        return; // none were found!
    }
    $slugs = [];
    foreach ( $clinic_ids as $id ) {
        $slugs[] = strval( $id );
    }
    wp_set_object_terms( $post_id, $slugs, \'clinics\', true );
}

If you want to retrieve which clinics a post/doctor appears in:

$terms = wp_get_object_terms( $post_id, \'clinics\' );
foreach( $terms as $term ) {
    echo \'<p>\'.$term->name.\'</p>\';
    echo get_term_link( $term, \'clinics\' );
    $clinic = get_post( $term->slug ); // gets the original clinic post
}
add_action( \'before_delete_post\', function ( $post_id ) {
    $post_type = get_post_type( $post_id );

    // If this isn\'t a \'clinic\' post, skip
    if ( \'clinic\' != $post_type ) {
        return;
    }
    $term = get_term_by( \'slug\', strval( $post_id ) ,\'clinics\' );
    if ( false !== $term ) {
        wp_delete_term( $term_id, \'clinics\' );
    }
} );

SO网友:Jacob Peattie

你试图一次查询5000篇帖子,而你只需要一小部分。您的服务器可能被查询阻塞。即使它真的起作用了,效率也会非常低。使用WP Query只查询您需要的帖子。

$args = array(
    \'posts_per_page\' => -1,
    \'post_type\'  => \'doctors\',
    \'orderby\'    => \'ID\',
    \'nopaging\'   => true,
    \'meta_key\'   => \'clinic_id\',
    \'meta_value\' => get_queried_object_id(),
);
$listDoctors = new WP_Query($args);
请注意,此代码假定clinic_id 是您所在领域的正确meta_键,该ID与当前诊所页面的ID匹配。

结束

相关推荐

使用新的WP-Query()从循环中过滤后期格式;

嗨,我目前正在为我的博客构建一个主题。下面的代码指向最新的帖子(特色帖子)。因为这将有一个不同的风格比所有其他职位。然而我想过滤掉帖子格式:链接使用我在循环中定义的WP查询,因为它给我带来了更多的灵活性。我该怎么做呢? <?php $featured = new WP_Query(); $featured->query(\'showposts=1\'); ?> <?php while ($featured->have_post