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?
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]
)
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
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]
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!
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".
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'
.[paragraph LAST]
équivaut à [paragraph last]
.foreach
que j'ai créée est protégée contre les attributs indexés par un entier.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
}
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.
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
}