web-dev-qa-db-fra.com

Attribut vide de shortcode

Est-il possible de créer un attribut vide pour un shortcode?

Exemple:

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

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

add_shortcode('paragraph', 'paragraph_shortcode'); 

Types d'utilisateurs

[paragraphe] quelque chose [/ paragraphe]

et cela montre

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

Comment ajouter une fonctionnalité d'attribut vide à mon premier code? Alors, quand l'utilisateur tape

[dernier paragraphe] quelque chose [/ paragraphe]

Il produira:

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

Je crois ajouter un:

extract( shortcode_atts( array(
            'last' => '',
        ), $atts ) );

est un bon début, mais comment vérifier si l’utilisateur a utilisé le dernier attribut alors qu’il n’a pas de valeur?

5
Wordpressor

Il pourrait y avoir plusieurs façons de le faire. Malheureusement, je ne pense pas qu’il en résultera exactement ce que vous allez faire. ([paragraph last])

  1. Vous pouvez simplement créer des codes courts séparés pour [paragraph_first][paragraph_last][paragraph_foobar] qui gèrent le contenu $ sans avoir besoin d'attributs

  2. Vous pouvez définir la valeur par défaut pour last sur false au lieu de '', puis demander aux utilisateurs de procéder à [paragraph last=""]content[/paragraph]

  3. Vous pouvez ajouter un attribut plus significatif tel que position qui pourrait ensuite être utilisé tel que [paragraph position="first"] ou [paragraph position="last"]

En raison du fait que WordPress supprime les atts non définis par défaut et du fait qu'une att sans ="value" se voit attribuer la valeur par défaut comme si elle ne figurait pas du tout, je ne vois aucun moyen d'atteindre [paragraph last]

J'espère qu'une de mes 3 solutions de contournement s'avérera utile. Bonne chance!

0
SethMerrick

WordPress ne supprime pas les attributs sans valeurs comme le suggère SethMerrick, mais ne le gère pas comme prévu. Dans votre exemple, vous ne pourriez pas vérifier isset($atts['last']), mais "last" est passé en tant que valeur à un attribut non nommé. Dans ce cas, cela donnerait TRUE: ($atts[0] == 'last'). Ainsi, vous pouvez faire une boucle foreach pour rechercher tout attribut ayant la valeur "last".

10
kingjeffrey

Lorsque [example attr1="value1" attr2 attr3="value3" attr4] est analysé, le paramètre $atts donne:

$atts = array (
    'attr1' => 'value1',
          0 => 'attr2',
    'attr3' => 'value3',
          1 => 'attr4'
);

Vous pouvez normaliser ceci comme ceci, vous pouvez alors appeler shortcode_atts dessus.

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');

Autres notes:

  • [paragraph last] ferait $last = true. [paragraph last="1"] ferait $last = '1'.
  • Les attributs n'étant pas sensibles à la casse, [paragraph LAST] équivaut à [paragraph last].
  • Les attributs ne pouvant pas être purement numériques, la boucle foreach que j'ai créée est protégée contre les attributs indexés par un entier.
6
M Miller

Je sais que c'est vieux, mais je ne pensais pas que l'une des réponses était complète, des réponses compactes. De nombreuses personnes suggèrent d'exécuter le tableau $atts dans un foreach pour rechercher si votre valeur existe. En réalité, je ne pense pas que cela doive être aussi compliqué. array_search pourrait être utilisé à la place pour simplifier les choses.

Dans le cas de votre exemple, vous pourriez utiliser ceci:

[paragraph last] something [/paragraph]

ensuite, pour déterminer si l'attribut vide est fourni, utilisez une condition de base pour vérifier si la clé a renvoyé la valeur null ou sous la forme d'un entier (y compris zéro):

// 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
}
4
Mike

La réponse acceptée ici est à la fois fausse et correcte. La phrase:

"WordPress élimine tous les atts non définis par défaut"

est uniquement vrai only de la fonction shortcode_atts et non de la fonctionnalité WP shortcode dans son ensemble.

Si vous regardez le code ci-dessous:

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;
}

Un code abrégé comme [paragraph last] something [/paragraph] aura toujours une valeur de false pour le $isLast var.

Le problème est que lorsque la fonction shortcode_atts l'exécute fait / ignore les attributs sans valeur. Cependant, ils sont absolument dans le tableau $atts before . Un var_dump de $atts en tant que première ligne de la fonction custom_shortcode_paragraph produirait:

array(1) {
  [0]=>
  string(4) "last"
}

Ainsi, l'élément 0th du tableau est une chaîne du nom de l'attribut forcé en minuscule.

Modifions le code comme suit:

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;
}

Vous avez maintenant $atts['last'] === true && $isLast === true pour le shortcode:

[paragraph last] something [/paragraph]

si vous finissez par ajouter une valeur alors le shortcode:

[paragraph last="any value at all"] something [/paragraph]

voudriez-vous $atts['last'] === "any value at all" && $isLast === true. $last serait false car le tableau $atts au début a le contenu suivant:

array(1) {
  ["last"]=>
  string(16) "any value at all"
}

Ainsi, la valeur de l'élément de tableau n'est plus le nom de l'attribut et in_array('last', $atts) === false. La valeur par défaut est donc shortcode_atts est false. mais c'est juste un default qui est écrasé par la valeur réelle de any value at all et ensuite $atts['last'] !== false est true car "any value at all" !== false.

Tout cela dit, je pense que cela fait ce que vous voulez et résiste aux erreurs des utilisateurs.

1
Infinity Media

J'ai trouvé ceci: http://richjenks.com/wp-shortcode-attributes-without-values/

CODE

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;

}

USAGE

$flags = get_flags($atts);
if (in_array('your_flag', $flags) {
    // Flag is present
}
1
benoît