【问题标题】:Custom Shortcode w/ Custom $tax_query Attribute带有自定义 $tax_query 属性的自定义简码
【发布时间】:2020-09-17 16:52:44
【问题描述】:

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

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

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

顺便说一句,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' );

【问题讨论】:

    标签: php wordpress attr wordpress-shortcode


    【解决方案1】:

    除非您计划实际重做整个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() 如果不存在,则返回一个错误值,因此您应该将其包装在 if 语句中,以防由于某种原因(损坏、删除、忘记)找不到图像添加等)。你在get_the_post_thumbnail_url() 中有一个$page-&gt;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"]

    【讨论】:

    • 非常感谢这里的答案!这完全符合我的预期。还要感谢您的其他注释...我将 $page->ID 更改为 null 并制作了一些其他 mods 以满足我的需要,但这让我走上了我需要的道路。
    • 谢谢!我在我的 args 中缺少 $tax_query 周围的 array() 并且没有注意到
    猜你喜欢
    • 1970-01-01
    • 2011-10-17
    • 1970-01-01
    • 1970-01-01
    • 2011-11-28
    • 2011-03-27
    • 2014-11-26
    相关资源
    最近更新 更多