加载自定义类型和其ID不在这些自定义类型自定义字段内的帖子的查询

时间:2014-07-21 作者:Alevalentini

在我的新闻网站上,我有帖子和另一种称为“聚合”的自定义类型。此类型有10个自定义字段,“link01”、“link02”。。。“link10”。

post和aggregato都有一个称为“home”的元键,用于表示WP,将帖子放在首页。

我想查询加载12篇最新帖子或聚合的首页,其中home>0. 我还想排除在aggregato中链接的帖子。

如果这是一个简单的SQL查询,我会创建一个类似以下内容的子句:

WHERE post.home>0
AND aggregato.home>0
AND post.id<>aggregato.link01
...
AND post.id<>aggregato.link10
LIMIT 12
解决方法可以是双重查询。第一个是aggregato类型,第二个是post类型。尽管如此,我还是希望找到正确的WP\\u查询。

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

首先:当然,从理论上讲,您可以使用原始MySQL查询WordPress数据库
请参见wpdb\'sget_results 方法这可能会为您节省第二个查询,但显然不会返回正确的WP_Post 对象。

尽管如此,如果你想使用WP_Query, 您将无法使用两个查询。我还是推荐它胜过以上也许效率较低,但肯定不会那么麻烦。除非您的posts表非常庞大,否则它应该不会是一个问题。

首先,获取最新的12篇聚合文章,遍历元数据,然后获取实际的12篇来显示。可能看起来不是最油滑的,但无论如何:

$twelve_aggregatos = new WP_Query(
    array(
        \'post_type\' => \'aggregato\',
        \'posts_per_page\'=> 12,
        \'meta_query\' => array(
            array(
                \'key\' => \'home\',
                \'value\' => 0,
                \'compare\' => \'>\'
            )
        )
    )
);

$linked_posts = array();
if ( $twelve_aggregatos->have_posts() ) {
    while ( $twelve_aggregatos->have_posts() ) {
        $twelve_aggregatos->the_post();
        $current_ID = get_the_ID();
        for ( $i = 1; $i <= 10; $i++ ) {
            /* The below asumes that the custom fields hold post IDs  */
            $linked_ID = get_post_meta(
                $current_ID,
                \'link\'.str_pad( $i, 2, \'0\', STR_PAD_LEFT ),
                true
            );
            /* Should they hold URLs, use the following instead */
            /* $linked_ID = url to postid(
                get_post_meta(
                    $current_ID,
                    \'link\'.str_pad( $i, 2, \'0\', STR_PAD_LEFT ),
                    true
                )
            ); */
            if ( ! in_array( $linked_ID, $linked_posts ) ) {
                $linked_posts[] = $linked_ID;
            }
        }
    }
}
wp_reset_postdata();

$twelve_reults = new WP_Query(
    array(
        \'post_type\' => array( \'post\', \'aggregato\' ),
        \'posts_per_page\'=> 12,
        \'meta_query\' => array(
            array(
                \'key\' => \'home\',
                \'value\' => 0,
                \'compare\' => \'>\'
            )
        )
        \'post__not_in\' => $linked_posts
    )
);

/* Loop over results, do something */

wp_reset_postdata();

SO网友:bravokeyl

$exclude_posts = array();//array of id\'s that are in aggregato custom fields
$query = new WP_Query( array(
    \'post_type\' => array( \'post\', \'aggregato\' ),
    \'posts_per_page\'=> 12,
    \'posts_not_in\' => $exclude_posts,
    \'meta_query\' => array(
        array(
            \'key\' => \'home\',
            \'value\' => \'_wp_zero_value\',
            \'compare\' => \'>\'
             )
    )
    ) );
您可以检查WP_Query 有关详细信息

您可以使用url_to_postid() 从url获取id

结束

相关推荐

当网站恢复时,WP在MySQL上遇到查询

我正在从VM上的本地开发人员运行我的网站。除恢复位外,其他一切正常。当我恢复机器时,系统地加载WP需要很长时间。实际上,问题不在于WP本身,而在于MySQl和WP对DB的查询。使用以下命令查看系统挂起的查询/进程mysql -uUSERNAME -pPASSWORD DATABASE -e \"show processlist;\" 返回以下内容| 203 | jumpinuk | localhost:60327 | jumpinuk | Query | 0 | closing tab