$wpdb->GET_RESULTS的速度优化

时间:2012-12-17 作者:bumTomica

我使用这段代码从所有帖子中为名为“autor”的自定义字段生成所有自定义字段值。

<?php $autor = $wpdb->get_results("SELECT meta_value AS autor FROM wp_posts, wp_postmeta WHERE post_status = \'publish\' AND meta_key = \'autor\' GROUP BY meta_value ORDER BY meta_value") ?>
<ol>
<?php foreach( $autor as $autori ) : ?>
<div class="autor">
<li><a href="http://simplynote.me/?s=<?php echo $autori->autor ?>"><?php echo $autori->autor ?></a></li>
</div>
<?php endforeach ?>
</ol>
它工作正常,但问题是服务器加载需要几秒钟的时间(比如,页面加载需要5-10秒)that particular page. 是否有任何方法可以优化此请求?

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

您的查询首先是不正确的,因为您没有正确地进行连接。通过该查询,您实际上选择的只是Posteta的所有autor字段,而不考虑帖子是否已发布。

这是正确的查询。

SELECT meta_value AS autor FROM wp_posts 
JOIN wp_postmeta ON (wp_postmeta.post_id =  wp_posts.ID) 
WHERE post_status = \'publish\' 
    AND meta_key = \'autor\' 
GROUP BY meta_value 
ORDER BY meta_value
这可能会更快,因为正确的连接将消除许多帖子。它不是完全最优的,但会有一些改进。

SO网友:kaiser

有一些事情需要考虑:

1准备查询并使用正确的前缀

这可以防止大多数尝试向DB中注入某些内容。

只需使用$wpdb->tablename. 在你的情况下$wpdb->posts. 您可能知道,可以添加一个名为$table_prefix 到您的wp-config.php-文件因此,如果您有一个自定义表,您应该使用{$wpdb->prefix}table_name.

然后使用prepare() - 你几乎可以在这里阅读每一个问答。该功能的工作原理类似于printf/sprintf() 在“普通”PHP中使用%s 替换字符串和%d 替换数字(int)。

$results = $wpdb->get_result( $wpdb->prepare(
    "
        SELECT meta_value AS autor 
        FROM $wpdb->posts, $wpdb->postmeta 
        WHERE post_status = \'publish\' 
        AND meta_key = \'%s\' 
        GROUP BY meta_value 
        ORDER BY meta_value
        DESC
    "
    ,\'autor\'
) );
使用适当的内部API一方面 (读入此存档)。

您可以使用以下筛选器pre_get_posts$query->set( \'key\', \'value\' ) 用于主查询和其他筛选器的对,如posts_clauses 或“较小”posts_orderby 截取查询字符串。

可用于检查查询的最后一个过滤器是post_results 过滤器对结果数据进行一些操作/解析。

你可以阅读more about it 在这个答案中。

3rd不要查询是否有模板标签来为您完成这项工作

另一方面,还有如下功能

结束

相关推荐

wpdb update multiple row?

我需要立即更改所有用户的元值。除了使用自定义数据库查询之外,似乎没有用于此的api。这是我的代码:$matches = array(\'meta_key\' => \'user_token\'); $data = array(\'meta_value\' => \'100\'); $wpdb->update( \"$wpdb->usermeta\", $data, $matches); 问题是,这只更新一个用户元值,而不是使用“user\\u token”