只有一个属性的短码必须使用数组吗?

时间:2018-05-15 作者:TinyTiger

我想构建一个采用单个属性的短代码。

所有在线内容都告诉我要使用阵列:

// Add Shortcode
function bg_comparison_points_shortcode( $atts ) {
    // Attributes
    $atts = shortcode_atts(
        array(
            \'custom_field\' => \'\',
        ),
        $atts,
        \'comparison_points\'
    );
    return bg_calculate_points($custom_field);
}
add_shortcode( \'comparison_points\', \'bg_comparison_points_shortcode\' );
但在我看来,这样的事情要简单得多

// Add Shortcode
function bg_comparison_points_shortcode( $custom_field ) {
    return bg_calculate_points($custom_field);
}
add_shortcode( \'comparison_points\', \'bg_comparison_points_shortcode\' );
做这个简单的版本有问题吗?

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

是的,问题是它行不通。

shortcode系统不知道将传递多少个参数,因此它会给您一个数组$atts 包含属性的。如果只有一个元素,那么数组将只有一个元素。如果未传递任何参数,数组将为空。

检查official documentation for a proper example:

<?php
function wporg_shortcode($atts = [], $content = null, $tag = \'\')
{
    // normalize attribute keys, lowercase
    $atts = array_change_key_case((array)$atts, CASE_LOWER);

    // override default attributes with user attributes
    $wporg_atts = shortcode_atts([
                                     \'title\' => \'WordPress.org\',
                                 ], $atts, $tag);

    // [...]

    // return output
    return $o;
}

function wporg_shortcodes_init()
{
    add_shortcode(\'wporg\', \'wporg_shortcode\');
}

add_action(\'init\', \'wporg_shortcodes_init\');
代码越长并不意味着代码越差。

在这种情况下,我想说的是相反的情况:如果您使用该数组以及它的所有用途,那么将来很容易扩展您的短代码,继续使用它,其他开发人员将更好地理解您的代码。

考虑到这一点,你可以这样写你的短代码

function bg_comparison_points_shortcode($atts = [], $content = null, $tag = \'\')
{
    // normalize attribute keys, lowercase
    $atts = array_change_key_case((array)$atts, CASE_LOWER);

    // override default attributes with user attributes
    $comparison_points_atts = shortcode_atts([
                                                 \'custom_field\' => \'\',
                                             ], $atts, $tag);

    return bg_calculate_points( $comparison_points_atts[\'custom_field\'] );
}

function bg_comparison_points_init()
{
    add_shortcode(\'comparison_points\', \'bg_comparison_points_shortcode\');
}

add_action(\'init\', \'bg_comparison_points_init\');

结束

相关推荐

Filter content in shortcode

所以,我对这个短代码有点陌生,但我现在几乎已经完成了我需要的工作。(检查下面的代码)我想在我的短代码中过滤我的内容,我有一个由ACF插件添加字段的CPT。现在我需要的是,当我放置[speaker\\u overview\\u 2017 year=2017]时,它只显示2017年有价值的项目,当我做[speaker\\u overview\\u 2017 year=2018]时,它只显示2018年,当我做[speaker\\u overview\\u 2017]时,它显示所有项目。这是我的短代码,有人能帮我