Wordpress 在短代码中插入参数?

Wordpress Insert Parameters In Shortcode?

我只和 几个 front-end 编辑一起工作。 在这些编辑器 非常不同 并且 不灵活的情况下! 我使用 code snippets 来显示我需要的信息处处一致。

如此简单以至于我觉得没有人理解我在做什么或试图做什么。请仔细阅读并查看插图。

以我今天为例

我有一个名为 property_city 的分类法附加到 CTP“属性”(没什么特别的)

它让我感兴趣,因为我想以这种方式显示它的条款 [Parent] -> [Child of parent] -> [Child of parent] -> 等所有层次结构方式

让我们尝试post一个广告好吗?

我的公寓位于曼哈顿,所以我选择了曼哈顿。默认情况下 parent New York 不显示。

使用这个 代码片段 是可能的

(/!\ 别搞混了,我们只使用片段代码,没有 php 文件或模板来修改。我们只是注入一个片段。/!)

function taxonomy_hierarchy() {
global $post;
$post_id = $post->ID;
$return = '';
$terms = wp_get_post_terms( $post->ID, 'property_city' ); //Put your custom taxonomy term here
foreach ( $terms as $term ) {

// this gets the parent of the current post taxonomy
    if ($term->parent != 0) {
        $return .= $term->name. ', ' .get_term( $term->parent, 'property_city' )->name;
    } else {
        $return .= $term->name;
    }
}
return $return;
}
add_shortcode( 'parent-child', 'taxonomy_hierarchy' );

完成! 纽约,现在显示曼哈顿。

我的问题是如何制作这个简码[parent-child]更灵活? 仅输出文本 (=nolink) parameter 或输出 links (=link).

在我们的示例中,它将看起来像这样

[parent-child=nolink] 对于我的循环,例如

[parent-child=link] posts.

如果您知道如何操作,谢谢

看一下 add_shortcode() documentation,您会看到回调函数传递了三个参数。最重要(并且与此相关)的是第一个 $atts 参数。

我会这样做:

add_shortcode( 'parent-child', 'taxonomy_hierarchy' );
function taxonomy_hierarchy( $atts ){
    $atts = 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
     * the link var 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 (filter_var($atts['link'], FILTER_VALIDATE_BOOLEAN)) ? sprintf( '<a href="%s">%s</a>, ', esc_url( get_term_link($parent_term) ), $parent_term->name ) : "{$parent_term->name}, " ;
        }

        echo (filter_var($atts['link'], FILTER_VALIDATE_BOOLEAN)) ? sprintf( '<a href="%s">%s</a>', esc_url( get_term_link($term) ), $term->name ) : $term->name ;
    }   

    return ob_get_clean();
}

这,使用 shortcode_atts() function 允许您为简码设置一些默认参数。我还设置了它 taxonomy 也可以被覆盖,这使得它更具可扩展性(供以后使用,在其他项目中等)

与字符串连接 (imo) 相比,我也稍微更改了代码以使用 Output Buffering since it's a bit faster and cleaner when dealing with Ternary Comparisons 和这样的输出。

它所做的是在确定输出链接名称或纯文本名称之前检查是否传递了 $link 属性,并将结果回显到输出缓冲区。

这将使您获得以下结果:

[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

等等。正如我在 PHP 评论中提到的,您可以在 foreach 循环之前的任何时候根据您想要的任何条件覆盖 $link 布尔值。因此,如果 is_single() 为真,您可以使 $link 始终 return 为真,或者如果当前用户不是编辑者,则始终 return 为假,或者您能想到的任何其他内容的。

文档和函数参考: