为什么`get_permarink()`会产生一个添加。没有$POST->筛选器的数据库请求?

时间:2011-09-19 作者:kaiser

我目前正在处理一个自定义循环/查询,需要将帖子的永久链接添加到从DB检索的帖子数组中。

悲哀地get_permalink() 为每个调用生成一个额外的DB请求,正如我所列出的,这可能会变得非常激烈all 一页上的帖子。

我首先想到的可能是get_option( \'permalink_structure\' ); get_option( \'default_category\' ); 没有自动加载选项,但两者都是自动加载的。此处证明:

function wpse_list_autoloaded_opts()
{
    $results = $wpdb->get_results( "
        SELECT option_name, option_value 
        FROM $wpdb->options 
        WHERE autoload = \'yes\'
    " );

    echo \'<pre>\';
    foreach( $results as $result ) 
        if ( \'permalink_structure\' === $result->option_name OR \'default_category\' === $result->option_name ) 
            echo "Name: {$result->option_name}, Value: {$result->option_value}<br />";
    echo \'<pre>\';
}
add_action( \'shutdown\', \'wpse_list_autoloaded_opts\' );
<小时>EDIT: 好的,我设法找到了the following lines 内部get_permalink() 作用

if ( is_object($id) && isset($id->filter) && \'sample\' == $id->filter ) {
        $post = $id;
        $sample = true;
    } else {
        $post = &get_post($id);
        $sample = false;
    }
So my Q is now: 我如何避免运行else part,调用get_post() 另外的查询呢?

<小时>EDIT 2: 现在发现get_permalink()Codex. 你可以通过整个$post 对象也输入函数。这解决了if ( is_object($id) 部分

Still open: 我到底要从哪里取回$post->filter 值为\'sample\'?

<小时>EDIT 3: 正在添加$post->filter = \'sample\' 到每个post对象解决了问题。但剩下的是一种不好的感觉,我可能会打破一些东西。这个\'sample\' 在里面$id/$post->filter 看起来很奇怪,我不知道它是从哪里来的。

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

我针对此问题的解决方法:

unset( $post->filter );

$url = get_permalink( $post );

结束

相关推荐

TwentyEleven菜单中的jQuery HoverIntent插件

TwentyEleven主题中的默认菜单非常好,纯CSS,但不幸的是,响应速度太快。如果它能以管理栏菜单响应的相同方式响应,那将是一件非常好的事情,即即时下拉,但在鼠标移出时会有一点延迟,以便在光标滑出菜单时让访问者返回菜单。在默认的TwentyEleven菜单中实现HoverIntent jQuery插件最有效的方法是什么?谢谢拍打