如果自定义字段值等于另一个自定义字段值,则显示帖子

时间:2015-09-23 作者:user636096

我有两种定制贴子类型“商店”和“餐厅”。

其中每个都有与之关联的自定义字段。

例如,商店中的一个字段是“Shop ID”,餐厅中的一个字段是“Restaurant ID”。

我想查询这两种自定义帖子类型,如果店铺ID为20,我想显示ID为20的所有餐厅。

我一直在玩弄这个代码:

            <?php

            $args = array(
                \'numberposts\'   => -1,
                \'post_type\'     => \'shops\', \'restaurants\',
                \'meta_query\'    => array(
                    \'relation\'      => \'AND\',
                    array(
                        \'meta_key\'      => \'shop-id\',
                        \'meta_value\'    => \'12345\',
                        \'compare\'   => \'=\'
                    ),
                    array(
                        \'meta_key\'      => \'restaurant-id\',
                        \'meta_value\'    => \'12345\',
                        \'type\'      => \'NUMERIC\',
                        \'compare\'   => \'>\'
                    )
                )
            );

            // query
            $the_query = new WP_Query( $args );

            ?>
            <?php if( $the_query->have_posts() ): ?>
                <?php while( $the_query->have_posts() ) : $the_query->the_post(); ?>
                    <h4>
                        <a href="<?php the_permalink(); ?>">
                            <?php the_title(); ?>
                        </a>
                    </h4>
                <?php endwhile; ?>
            <?php endif; ?>
注意,我还使用高级自定义字段。

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

您的问题和您提供的代码之间存在一些矛盾,因此我不确定您正在处理的两个场景中的哪一个。

场景1-要显示具有特定值的所有店铺shop-id 以及所有具有相同特定价值的餐厅restaurant-id. 假设值为20。你可以用一个WP_Query() 循环,用于查找自定义字段具有指定值的两种帖子类型。这假设商店永远不会对restaurant-id 反之亦然。

$args = array(
    \'posts_per_page\' => -1,
    \'post_type\' => array( \'shop\', \'restaurant\' ),
    \'meta_query\' => array(
        \'relation\' => \'OR\',
        array(
            \'key\' => \'restaurant-id\',
            \'value\' => 20,
            \'compare\' => \'=\'
        ),
        array(
            \'key\' => \'shop-id\',
            \'value\' => 20,
            \'compare\' => \'=\'
        )
    )
);
$query = new WP_Query( $args );
场景2-您希望显示所有店铺,每个店铺后面都是具有相同价值的所有餐厅restaurant-id 作为当前店铺的shop-id.

$shops = new WP_Query(
    array(
        \'posts_per_page\' => -1,
        \'post_type\' => \'shop\'
    )
);

if ( $shops->have_posts() ) {
    while ( $shops->have_posts() ) {
        $shops->the_post();
        ...
        $shop_id = get_post_meta( $post->ID, \'shop-id\', true );
        $restaurants = new WP_Query(
            array(
                \'posts_per_page\' => -1,
                \'post_type\' => \'restaurant\',
                \'meta_query\' => array(
                    array(
                        \'key\' => \'restaurant-id\',
                        \'value\' => $shop_id,
                        \'compare\' => \'=\'
                    )
                )
            )
        );
        if ( $restaurants->have_posts() ) {
            while ( $restaurants->have_posts() ) {
                $restaurants->the_post();
                ...
            }
        }
    }
}

SO网友:Dunimas

我不知道如何使用WP\\u Query实现这一点,但您可以编写自定义SQL来实现这一点:

global $wpdb;

$id = \'20\';

$sql = "SELECT * FROM $wpdb->posts p
LEFT JOIN $wpdb->postmeta pm ON p.ID = pm.post_id AND pm.meta_key IN (\'shop-id\',\'restaurant-id\')
WHERE p.post_type IN (\'shops\',\'restaurants\')
AND (
    ( pm.meta_key = \'shop-id\' AND pm.meta_value = %i )
    OR ( pm.meta_key = \'restaurant-id\' AND pm.meta_value = %i )
)";

$query = $wpdb->get_results($wpdb->prepare($sql,$id));
这将返回所有结果,其中post类型是商店或餐厅,并且商店id或餐厅id与提供的id匹配。

SO网友:user636096

这在下面起作用,但我只想让它比较价值并返回“店铺”,目前,它正在返回价值为20的店铺和餐厅!

            $args = array(
                \'posts_per_page\' => -1,
                \'post_type\' => array( \'shop\', \'restaurant\' ),
                \'meta_query\' => array(
                    \'relation\' => \'OR\',
                    array(
                        \'key\' => \'restaurant-id\',
                        \'value\' => 20,
                        \'compare\' => \'=\'
                    ),
                    array(
                        \'key\' => \'shop-id\',
                        \'value\' => 20,
                        \'compare\' => \'=\'
                    )
                )
            );
            $query = new WP_Query( $args );

相关推荐

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

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