WordPress代码标准和短码中的工作$link参数

时间:2021-01-07 作者:neosan

我有一段代码,

add_shortcode( \'parent-child\', \'taxonomy_hierarchy\' );
function taxonomy_hierarchy( $atts ){
    extract( shortcode_atts( array(
        \'link\' => true,
        \'taxonomy\' => \'property_city\'
    ), $atts, \'parent-child\' ) );

    global $post;
    $terms = wp_get_post_terms( $post->ID, $taxonomy );

    /* You can pass conditions here to override
     * $link based on certain conditions. If it\'s
     * a single post, current user is editor, etc.
     */

    ob_start();
    foreach( $terms as $term ){
        if( $term->parent != 0 ){
            $parent_term = get_term( $term->parent, $taxonomy );
            echo ($link != false) ? sprintf( \'<a href="%s">%s</a>, \', esc_url( get_term_link($parent_term) ), $parent_term->name ) : "{$parent_term->name}, " ;
        }

        echo ($link != false) ? sprintf( \'<a href="%s">%s</a>\', esc_url( get_term_link($term) ), $term->name ) : $term->name ;
    }   

    return ob_get_clean();
}
这将允许您获得以下结果:用法

**[parent-child]**
• <a href="#">New York</a>
• <a href="#">New York</a>, <a href="#">Manhattan</a>

**[parent-child link="true"]**
• <a href="#">New York</a>
• <a href="#">New York</a>, <a href="#">Manhattan</a>

**[parent-child link="false"]**
• New York
• New York, Manhattan

[parent-child link="false" taxonomy="some_other_taxonomy"]
• Top Level Term
• Top Level Term, Child Level Term
一切正常,显示如期!只是我的参数不起作用。

我没能得到[parent-child link="false"] 工作在我研究短代码如何工作的过程中,我遇到了这些帖子,

link1link2link3

他们都说从不使用extractecho 在短代码中,wordpress代码和使用$atts$return 相反

这让人怀疑这一准则的有效性。。。

My question now is : 如何制作此短代码[parent-child] working with link=false , 并且在短代码中没有提取和回显。

谢谢你,如果你understood what i\'m talking about 知道如何让它更respectful of wordpress standards

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

如何使此短代码[父-子]与link=false一起工作,并且在短代码中不进行提取。

您永远不能将布尔值作为shortcode参数传递,而应该将其视为字符串。你对参数的比较link 价值false 应用作\'false\' (字符串)。

add_shortcode( \'parent-child\', \'taxonomy_hierarchy\' );
function taxonomy_hierarchy( $atts ){
    // Don\'t extract, rather parse shortcode params with defaults.
    $atts = shortcode_atts( array(
        \'link\' => \'true\',
        \'taxonomy\' => \'property_city\'
    ), $atts, \'parent-child\' );

    // Check the $atts parameters and their typecasting.
    var_dump( $atts );

    global $post;
    $terms = wp_get_post_terms( $post->ID, $atts[\'taxonomy\'] );

    /* You can pass conditions here to override
     * $link based on certain conditions. If it\'s
     * a single post, current user is editor, etc.
     */

    ob_start();
    foreach( $terms as $term ){
        if( $term->parent != 0 ){
            $parent_term = get_term( $term->parent, $taxonomy );
            if ($atts[\'link\'] !== \'false\') {
                printf( \'<a href="%s">%s</a>, \', esc_url( get_term_link($parent_term) ), $parent_term->name );
            } else {
                echo $parent_term->name . \', \';
            }
        }

        if ($atts[\'link\'] !== \'false\') {
            printf( \'<a href="%s">%s</a>\', esc_url( get_term_link($term) ), $term->name );
        } else {
            echo $term->name;
        }
    }

    return ob_get_clean();
}
短代码中无回声

这不是关于使用echo, 要求您不要在短代码内回显输出。相反,您应该返回它,因为WordPress将用您的输出值替换shortcode。在这里,您使用ob_start()ob_get_clean() 函数并返回它。这很好,是常用的技术。