最小化对数据库的wp_Query调用

时间:2018-11-07 作者:Steeve

我有一个非常基本的问题,这个问题可以通过原始sql查询轻松完成,我们可以将想要输出的数据库列命名为

      select id,name,date from tableA where id>\'100\'
但同样的事情Wp_Query 提供了大量与我们完全无关的垃圾数据。我们可以使用php 但问题是,它肯定会杀死数据库,因为它正在幕后进行大量调用。

我们与var_dump 而且它是巨大的数据,99%对我们没有用处。我们只想列出id和name列,而不是像这样的列PING_STATUS,COMMENT_STATUS,MENU_ORDER,COMMENT_STATUS

 while ( $has_more_images ) {

    $args = array(
        \'posts_per_page\' => \'100\',
        \'offset\'         => $offset,
        \'post_type\'      => \'attachment\',
        \'post_status\'    => \'any\',
        \'orderby\'        =>\'ID\',
        \'order\'          => \'ASC\',
        \'no_found_rows\'  => true


    );


    $the_query = new WP_Query( $args );
    var_dump( $the_query );

 }

2 个回复
最合适的回答,由SO网友:Jacob Peattie 整理而成

WP_Query 不是查询数据库的通用方法。它是专门为查询帖子而设计的,目的是循环浏览帖子并为其输出模板。

如果您只想从wp_posts 表,则只需编写SQL并使用$wpdb 要运行它的对象:

$query       = $wpdb->prepare( "SELECT ID, post_title FROM $wpdb->posts WHERE post_type = \'attachment\' ORDER BY ID LIMIT 100 OFFSET %d", $offset );
$attachments = $wpdb->get_results( $query );

if ( ! empty( $attachments ) ) {
    foreach ( $attachments as $attachment ) {
        $id   = $attachment->ID;
        $name = $attachment->post_title;
    }
}
这使用$wpdb->prepare() 方法安全地添加$offset 变量,然后使用$wpdb->get_results() 方法运行该查询并为每个结果返回对象数组。这个$wpdb->posts 查询的一部分允许您针对wp_posts 表,而不管数据库前缀可能是什么(用户可以将其配置为wp_, 在多站点上,每个站点都有一个不同的posts表)。

请记住wp_posts 表和附件帖子类型使数据的行为类似于帖子,其中状态和日期等内容很重要。如果您试图将posts用于与“post”不同的内容,那么您可能不应该使用posts表。

您似乎想在媒体库中列出所有内容的名称,我真的不知道您为什么要这样做,这是一件很奇怪的事情。因此,如果这不是您的实际用例,我建议您用实际情况更新您的问题。

SO网友:cjbj

这看起来是一个简单的问题,但它涉及到一个影响所有计算的复杂优化问题,从芯片组和低级编译器到WordPress之类的高级系统。任何用于通用目的的硬件或软件都必须在处理请求的方式上有所妥协。这意味着,如果专门为每个请求构建系统,则可能会更有效地处理每个请求。

所以,在你的情况下,你得出结论wp_query 转换为SQL 为了你的特殊目的,以一种低效的方式。鉴于上述情况,这是意料之中的。如果你知道是哪个SQL 要运行的查询,最有效的方法是通过wp_query, 并绕过WP本身的任何解析。像这样:

$sql = "SELECT SQL ... the rest of your query";
$query = new WP_Query();
$query->parse_query($sql);
$posts = $query->get_posts();  
WP的一个鲜为人知的特性是use filters 要更改SQL查询,请执行以下操作:wp_query 通常会生成。您可以使用这些过滤器来更改WP在解析查询时所做的默认妥协。如果要运行要优化的特定类型的查询,则可以使用这些查询。但是,如果您确实知道要运行哪个SQL,只需绕过WP的解析即可。

结束