使用术语而不是分类法显示自定义帖子类型

时间:2018-01-26 14:04:38

标签: php wordpress function shortcode

我现在正在构建一个非常复杂的网站,需要一种方法来使用各种方式显示所有自定义帖子类型。

我的自定义帖子目前已在此结构中进行了布局和定义:

自定义帖子类型:优惠

分类

  • 品牌1
    • 提供类型1
    • 提供类型2
    • 提供类型3
  • 品牌2
    • 提供类型1
    • 提供类型2
    • 提供类型3
  • 品牌3
    • 提供类型1
    • 提供类型2
    • 提供类型3

目前,我只能显示以下内容:

  1. 特定品牌,显示所有优惠类型
  2. 特定品牌显示特定要约类型
  3. 我也想拥有它,所以我可以通过显示特定要约类型显示所有品牌来显示以下情况。

    我认为实现这一目标的正确方法是为短代码创建一个数组'品牌'属性,所以我可以列出'品牌1','品牌2'等等?但是,我不确定如何实现这一目标。我无法获得短代码以使用该类型的数组,因此它只是所有类型或1。

    我使用的短代码是[提供品牌='品牌-1'类型='提供-1型']

    希望上面有意义,我的主题functions.php文件中的当前代码如下:

                function register_shortcodes() {
                    add_shortcode( 'offers', 'shortcode_offer_type_by_brand' );
                }
                add_action( 'init', 'register_shortcodes' );
    
                /**
                 * Offer Shortcode Callback
                 * 
                 * @param Array $atts
                 *
                 * @return string
                 */
    
                //Start Offers Shortcode 1
    
                function shortcode_offer_type_by_brand( $atts ) {
    
                ob_start();
    
                    global $wp_query,
                        $post;
    
                    $atts = shortcode_atts( array(
                        'posts' => 8, //sets number of posts
                        'pages' => false, //sets pagination
                        'brand' => '', //brand name goes here in shortcode
                        'type' => array( 'offer-type-1','offer-type-2','offer-type-3' ) //offer type is defined, by default show all offer types
                    ), $atts );
    
                    if ($atts['pages'] == true ) { //if shortcode defines pages as true, enable pagination
    
                        $paged = (get_query_var('paged')) ? get_query_var('paged') : 1;
    
                        $loop = new WP_Query( array(
                            'paged' => $paged,
                            'posts_per_page'    => $atts['posts'],
                            'post_type'         => 'offers',
                            'tax_query'         => array( array(
                                'taxonomy'  => $atts['brand'],
                                'field'     => 'slug',
                                'terms'     => $atts['type']
                            ) )
                        ) );
    
                    } else {
                        $loop = new WP_Query( array( //if shortcode defines pages as false or no value, disable pagination
                            'posts_per_page'    => $atts['posts'],
                            'post_type'         => 'offers',
                            'order'             => 'rand',
                            'tax_query'         => array( array(
                                'taxonomy'  => $atts['brand'],
                                'field'     => 'slug',
                                'terms'     => $atts['type']
                            ) )
                        ) );
                    }
    
                    ?>
    
                   <?php
    
                    if( ! $loop->have_posts() ) {
                       ?>
                       <h3>We currently have no offers. Please check back soon.</h3>
                       <?php
                    }
    
                    ?>
    
                    <?php
    
                    while( $loop->have_posts() ) {
                        $loop->the_post();
    
                        ?>
                                <div class="offer">
                                    <div class="offerText">
                                        <h3><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></h3>
                                    </div>
                                </div>
                        <?php
    
                        next_posts_link( '&larr; Older posts', $loop ->max_num_pages);
                        previous_posts_link( 'Newer posts &rarr;' );
    
                    } 
    
                    wp_reset_postdata();
    
                    ?>
    
                    <?php
    
                return ob_get_clean();
    
                }
    

    任何帮助将不胜感激!感谢。

    修改

    使用Tuhin的回复,使用的最终代码与他的数组相关,我在$ andor变量上使用默认值始终是关系&#39; OR&#39;除非在短代码变量中定义。

                $brands = $atts['brand'];
                $offers = $atts['type'];
                $andor = $atts['andor'];
                $args = [
                    'post_type' => 'offers',
                    'tax_query' => [
                        'relation' => $andor,
                        [
                            'taxonomy' => 'brand',
                            'field' => 'slug',
                            'terms' => $brands
                        ],
                        [
                            'taxonomy' => 'offer',
                            'field' => 'slug',
                            'terms' => $offers
                        ],
                    ]
                ];
    

1 个答案:

答案 0 :(得分:1)

我试图问你一个问题,但由于我现在没有足够的代表,我将添加一个答案。从您的示例来看,您似乎在每个品牌条款下使用相同的优惠条款(优惠1,优惠2,优惠3),您似乎在重复每个品牌下的条款。

我认为通过实际拥有两种不同的分类法可以简化您尝试实现它的方式。因此,对于帖子类型“优惠”,您可以拥有一个分类“品牌”和另一个“优惠”。

所以品牌可以有不同的价值,如:

  • 品牌1
  • 品牌2
  • 品牌3

然后您可以为“优惠”指定不同的值,例如:

  • 提供1
  • 提供2
  • 提供3

现在您可以搜索任何组合,例如:

$brands = $atts['brand'];
$offers = $atts['type'];
$args = [
    'post_type' => 'offers',
    'tax_query' => [
        'relation' => 'OR',
        [
            'taxonomy' => 'brand',
            'field' => 'slug',
            'terms' => $brands
        ],
        [
            'taxonomy' => 'offer',
            'field' => 'slug',
            'terms' => $offers
        ],
    ]
];

这将返回包含任何这些分类条目的所有优惠帖子类型。所以,如果你已经填写