带有自定义 $tax_query 属性的自定义简码

Custom Shortcode w/ Custom $tax_query Attribute

我正在尝试在 Wordpress 中创建一个自定义简码,它可以让我放置一个属性来指定一个类别,并在名为“case_studies”的自定义 post 类型中进行查询。分类法本身称为“case_study_categories”,如您所见,我将默认设置为“furniture-interior”。

我需要的是短代码看起来像这样: [get_project_gallery order="ASC" tax_query="flooring"]

理想情况下,我放置的短代码属性将覆盖默认的“furniture-interior”,而是使用“flooring”来显示适当的 posts。实际上,我认为我什至根本不需要定义默认值(所以如果没有指定属性,它只会得到所有 case_studies posts)但我无法得到它要么工作。

顺便说一句,order 的属性完全按照我想要的方式工作——它覆盖了定义的默认值。我只是不知道如何用 $tax_query.

来完成这件事

如能提供任何帮助,我们将不胜感激。提前谢谢大家! 这是我的代码:

function project_gallery_function($atts, $content = null) {
extract(shortcode_atts(array(
            'order' => 'DESC',
            'orderby' => 'date',


            'tax_query' => array(
                array(
                    'taxonomy' => 'case_study_categories',
                    'field' => 'slug',
                    'terms' => 'furniture-interior'
                        
                )
             )


    ), $atts));

$args = array( 
    'post_type' => 'case_studies',
    'post_status' => 'publish', 
    'posts_per_page' => '4',
    'order' => $order,
    'orderby' => $orderby,
    'tax_query' => array($tax_query)





);
// The Query
$the_query = new WP_Query( $args );

// The Loop
if ( $the_query->have_posts() ) {
  echo '<aside class="grid-gallery four-col grid-gap-4">';
  
  while ( $the_query->have_posts() ) {
    $the_query->the_post();

    $gallery_thumb = get_the_post_thumbnail_url( $page->ID, 'thumbnail' );
    echo '<a href="'. get_the_permalink() .'" class="x-image mobx sub-img" data-rel="gallery-1"><img src="'. $gallery_thumb .'" alt="" /></a>';

  }
  
  echo '</aside>';
  
}
/* Restore original Post Data */
wp_reset_postdata();


}
add_shortcode( 'get_project_gallery', 'project_gallery_function' );

除非您计划实际重做整个 tax_query,否则您不应该担心整个 tax_query。您应该考虑将其更改为仅使用 $terms,因为这是您要用短代码替换的唯一部分(您不需要重建整个数组)。

其次,确保您的代码使用间距和缩进规范化 - 未来您会感谢您的深谋远虑!

最后,您可以考虑将更多变量传递给数组以使其更具可扩展性 - $posts_per_page$taxonomy

function project_gallery_function( $atts, $content = null ){
    extract( shortcode_atts( array(
        'terms' => 'furniture-interior',
        'field' => 'slug',
        'order' => 'DESC',
        'orderby' => 'date',
        'taxonomy' => 'case_study_categories',
        'post_type' => 'case_studies',
        'posts_per_page' => 4,
    ), $atts ) );

    $tax_query = array(
        array(
            'taxonomy' => $taxonomy,
            'field'    => $field,
            'terms'    => explode(',', preg_replace('/\s+/', '', $terms)), // Force to array, allowing comma sep values
        )
    );

    $args = array( 
        'post_type'      => $post_type,
        'post_status'    => 'publish', 
        'posts_per_page' => $posts_per_page,
        'order'          => $order,
        'orderby'        => $orderby,
        'tax_query'      => array( $tax_query )
    );
    
    // The Query
    $the_query = new WP_Query( $args );

    // The Loop
    if( $the_query->have_posts() ){
        echo '<aside class="grid-gallery four-col grid-gap-4">';
            while( $the_query->have_posts() ){
                $the_query->the_post();

                if( $gallery_thumb = get_the_post_thumbnail_url( $page->ID, 'thumbnail' ) ){
                    printf( '<a href="%s" class="x-image mobx sub-img" data-rel="gallery-1"><img src="%s" alt="" /></a>', get_the_permalink(), $gallery_thumb );
                }
            }
        echo '</aside>';
    }
    
    /* Restore original Post Data */
    wp_reset_postdata();
}
add_shortcode( 'get_project_gallery', 'project_gallery_function' );

一些其他注意事项,get_the_post_thumbnail_url() returns 如果不存在则为假值,因此您应该将其包装在 if 语句中以防无法显示图像出于某种原因发现(损坏、删除、忘记添加等)。另外,您在 get_the_post_thumbnail_url() 中有一个 $page->ID 变量 - 但函数中似乎没有 global $page ?确保那是你想在那里使用的变量。

使用像我提供的那样的代码可以让你做你想做的事,[get_project_gallery order="ASC" terms="flooring"],甚至可以添加多个 [get_project_gallery order="ASC" terms="flooring,something-else,a-third-thing"] - 只需将短代码属性与你想要覆盖的参数匹配: [get_project_gallery order="ASC" terms="flooring,something-else,a-third-thing" posts_per_page="15"]