Shortcode empty attribute

时间:2011-03-03 作者:Wordpressor

有没有办法为短代码创建一个空属性?

示例:

function paragraph_shortcode( $atts, $content = null ) {

   return \'<p class="super-p">\' . do_shortcode($content) . \'</p>\';
}

add_shortcode(\'paragraph\', \'paragraph_shortcode\'); 
用户类型

某物

它显示了

<p class="super-p"> something </p>

如何将空属性功能添加到我的第一个代码中?所以当用户输入

[最后一段]某物

它将输出:

<p class="super-p last"> something </p>
我认为添加一个:

extract( shortcode_atts( array(
            \'last\' => \'\',
        ), $atts ) );
这是一个很好的开始,但如何检查用户是否使用了“last”属性,而它没有值?

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

有几种方法可以做到这一点。不幸的是,我不认为任何结果会完全符合你的目的。( [paragraph last] )

您只需为[paragraph_first] [paragraph_last] [paragraph_foobar] 无需任何属性即可处理$内容

您可以将last的默认值设置为false 而不是\'\', 然后要求用户执行[paragraph last=""]content[/paragraph]

您可以添加一个更有意义的属性,例如position 然后可以像这样使用[paragraph position="first"][paragraph position="last"]

因为WordPress丢弃了任何未给定默认值的att,并且没有="value" 如果给定的默认值与未列出的值相同,我看不到任何实现方法[paragraph last]

希望我的3种变通方法中的一种会很有用。祝你好运

SO网友:kingjeffrey

WordPress不会像SethMerrick建议的那样丢弃没有值的属性,但它不会像您所期望的那样处理它。在您的示例中,您将无法检查isset($atts[\'last\']), 但“last”作为值传递给未命名属性。在这种情况下,这将导致TRUE:($atts[0] == \'last\'). 因此,可以执行foreach循环来检查值为“last”的任何属性。

SO网友:M Miller

什么时候[example attr1="value1" attr2 attr3="value3" attr4] 分析后$atts 参数产量:

$atts = array (
    \'attr1\' => \'value1\',
          0 => \'attr2\',
    \'attr3\' => \'value3\',
          1 => \'attr4\'
);
你可以这样规范化它,然后你可以调用shortcode_atts 在上面。

if (!function_exists(\'normalize_empty_atts\')) {
    function normalize_empty_atts ($atts) {
        foreach ($atts as $attribute => $value) {
            if (is_int($attribute)) {
                $atts[strtolower($value)] = true;
                unset($atts[$attribute]);
            }
        }
        return $atts;
    }
}

function paragraph_shortcode ($atts, $content = null) {
    extract(shortcode_atts(
        array (
            \'last\' => \'\'
        ),
        normalize_empty_atts($atts)
    ));

    return \'<p class="super-p\'
        .($last ? \' last\' : \'\')
        .\'">\'
        .do_shortcode($content)
        .\'</p>\';
}

add_shortcode(\'paragraph\', \'paragraph_shortcode\');

Other notes:

  • [paragraph last] 将使$last = true. [paragraph last="1"] 将使$last = \'1\'.[paragraph LAST] 相当于[paragraph last].foreach 我创建的循环对整数索引属性是安全的

SO网友:Mike

我知道这很古老,但我觉得任何答案都不完整、简洁。许多人建议$atts 通过foreach数组来查找您的值是否存在。事实上,我觉得事情不需要那么复杂;array\\u search可以用来简化事情。

在您的示例中,您可以使用:

[paragraph last] something [/paragraph]

然后,要确定是否提供了空属性,请使用基本条件检查键是否返回null或整数(包括零):

// Returns the array key, if empty attribute is found
$last_key = array_search(\'last\', $atts);

// Determine if the key is an integer, zero or greater
// (In the event you\'re passing multiple empty attributes)
if(is_int($last_key)) {
  // Do something, your attribute is set
}

SO网友:benoît

我发现了这个:http://richjenks.com/wp-shortcode-attributes-without-values/

密码

function get_flags($atts) {

    $flags = array();

    if (is_array($atts)) {
        foreach ($atts as $key => $value) {
            if ($value != \'\' && is_numeric($key)) {
                array_push($flags, $value);
            }
        }
    }

    return $flags;

}
使用情况

$flags = get_flags($atts);
if (in_array(\'your_flag\', $flags) {
    // Flag is present
}

SO网友:Infinity Media

这里公认的答案是对的和错的。短语:

“WordPress放弃任何未给定默认值的ATT”

仅为trueshortcode_atts 功能,而不是整个WP短代码功能。

如果查看以下代码:

add_shortcode( \'paragraph\', \'custom_shortcode_paragraph\' );
function custom_shortcode_paragraph( $atts ) {
    // Attribute Defaults Function 
    $atts = shortcode_atts(
        array(
            \'last\' => false,
        ),
        $atts
    );
    $isLast = $atts[\'last\'] !== false;
}
短代码用法如下[paragraph last] something [/paragraph] 将始终具有值false 对于$isLast 变量。

问题是shortcode_atts 函数运行时,会丢弃没有值的属性。然而,他们绝对处于$atts 但在该点之前排列。A.var_dump 属于$atts 作为custom_shortcode_paragraph 功能将产生:

array(1) {
  [0]=>
  string(4) "last"
}
所以0th 数组中的项是强制为小写的属性名称字符串。

让我们将代码改为以下内容:

add_shortcode( \'paragraph\', \'custom_shortcode_paragraph\' );
function custom_shortcode_paragraph( $atts ) {
    // look for the existance of the string \'last\' in the array
    $last = in_array(\'last\', $atts); // $last is now a boolean
    // Attribute Defaults Function 
    $atts = shortcode_atts(
        array(
            \'last\' => $last, // default to true if the attribute existed valueless
        ),
        $atts
    );
    $isLast = $atts[\'last\'] !== false;
}
你现在有$atts[\'last\'] === true && $isLast === true 对于短代码:

[paragraph last] something [/paragraph]
如果您最终添加了一个值,则短代码:

[paragraph last="any value at all"] something [/paragraph]
会吗$atts[\'last\'] === "any value at all" && $isLast === true. $last 可能是false 因为$atts 开头的数组包含以下内容:

array(1) {
  ["last"]=>
  string(16) "any value at all"
}
因此,数组项的值不再是属性名和in_array(\'last\', $atts) === false 因此,默认值为shortcode_atts 这是错误的。但这只是一个默认值,被any value at all 然后$atts[\'last\'] !== falsetrue 因为"any value at all" !== false.

综上所述,我认为这可以满足您的需要,并且能够抵御用户错误。

结束

相关推荐

Nested Shortcode Detection

如果您熟悉此代码<?php $pattern = get_shortcode_regex(); preg_match(\'/\'.$pattern.\'/s\', $posts[0]->post_content, $matches); if (is_array($matches) && $matches[2] == \'YOURSHORTCODE\') { //shortcode is being used }&#