Shortcode leeres Attribut

7

Gibt es eine Möglichkeit, ein leeres Attribut für einen Shortcode zu erstellen?

Beispiel:

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

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

add_shortcode('paragraph', 'paragraph_shortcode'); 

Benutzertypen

[Absatz] etwas [/ Absatz]

und es zeigt

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

Wie füge ich meinem ersten Code eine leere Attributfunktion hinzu? Also wenn Benutzer tippt

[Absatz zuletzt] etwas [/ Absatz]

Es wird ausgegeben:

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

Ich glaube, ein:

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

ist ein guter Anfang, aber wie kann man überprüfen, ob der Benutzer das Attribut "last" verwendet hat, während es keinen Wert hat?

Wordpressor
quelle

Antworten:

1

Es gibt verschiedene Möglichkeiten, dies zu tun. Leider glaube ich nicht, dass irgendetwas genau das ergibt, was Sie wollen. ( [paragraph last])

  1. Sie können einfach separate Shortcodes für [paragraph_first] [paragraph_last] [paragraph_foobar]dieses Handle-$ -Inhalt erstellen , ohne Attribute zu benötigen

  2. Sie können den Standardwert für last auf falseanstelle von festlegen ''und dann die Benutzer dazu auffordern[paragraph last=""]content[/paragraph]

  3. Sie können ein aussagekräftigeres Attribut hinzufügen, positiondas dann wie [paragraph position="first"]oder verwendet werden kann[paragraph position="last"]

Aufgrund der Tatsache, dass WordPress alle Atts verwirft, denen keine Standardeinstellungen zugewiesen wurden, und der Tatsache, dass ein Att ohne einen ="value"den Standardwert erhält, der so ist, als ob er überhaupt nicht aufgeführt wäre, sehe ich keine Möglichkeit, dies zu erreichen[paragraph last]

Hoffentlich wird sich eine meiner 3 Problemumgehungen als nützlich erweisen. Viel Glück!

SethMerrick
quelle
13

WordPress verwirft keine Attribute ohne Werte, wie von SethMerrick vorgeschlagen, aber es behandelt es nicht wie erwartet. In Ihrem Beispiel können Sie nicht überprüfen isset($atts['last']), aber "last" wird als Wert an ein unbenanntes Attribut übergeben. In diesem Fall würde dies zu TRUE führen : ($atts[0] == 'last'). Sie können also eine foreach-Schleife ausführen, um nach Attributen mit dem Wert "last" zu suchen.

Kingjeffrey
quelle
1
So baue ich oft Shortcodes für Clients. Einfach zu tippen, leicht zu überprüfen.
Fuxia
1
+1 für die tatsächliche Beantwortung der Frage. (Die Problemumgehungen von SethMerrick sind sicherlich logisch, aber es fehlt die in der Frage beschriebene Funktionalität.) @Toscho - Welchen Code verwenden Sie dazu? Irgendeine Möglichkeit zu teilen? (Könnte als separate Antwort veröffentlicht werden.)
Supertrue
Diese Antwort würde gilt speziell für das Beispiel oben, aber es ist nicht wirklich eine gute Antwort , weil eine Implementierung davon zu unterscheiden , würde scheitern [example last]aus [example whatever="last"], da sie Werte und ignoriert Indizes überprüft.
M Miller
Tolle Lösung. Die ausgewählte Antwort löst die Frage nicht wie Ihre, obwohl sie einige gültige Alternativen bietet.
Mike
7

Wenn [example attr1="value1" attr2 attr3="value3" attr4]analysiert wird, $attsergibt der Parameter:

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

Sie können dies so normalisieren, dann können Sie es aufrufen 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');

Weitere Hinweise:

  • [paragraph last]würde machen $last = true. [paragraph last="1"]würde machen $last = '1'.
  • Bei Attributen wird die Groß- und Kleinschreibung nicht [paragraph LAST]berücksichtigt [paragraph last].
  • Attribute können nicht rein numerisch sein, daher ist die von foreachmir erstellte Schleife gegen ganzzahlig indizierte Attribute sicher.
M Miller
quelle
+1. Solche Funktionen sollten wirklich in den Kern eingebettet sein, damit WP Attribute auf konsistentere Weise bereitstellt. Gut gemacht!
Geomagas
4

Ich weiß, dass dies alt ist, aber ich hatte nicht das Gefühl, dass eine der Antworten vollständige, kompakte Antworten waren. Viele Leute schlagen vor, das $attsArray durch ein foreach zu führen, um festzustellen, ob Ihr Wert vorhanden ist. In Wirklichkeit muss es nicht so kompliziert sein. array_search könnte stattdessen verwendet werden, um die Dinge zu vereinfachen.

In Ihrem Beispiel könnten Sie Folgendes verwenden:

[paragraph last] something [/paragraph]

Um festzustellen, ob das leere Attribut bereitgestellt wird, überprüfen Sie anhand einer Grundbedingung, ob der Schlüssel null oder eine Ganzzahl (einschließlich Null) zurückgegeben hat:

// 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
}
Mike
quelle
1

Ich fand dies: 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;

}

VERWENDUNGSZWECK

$flags = get_flags($atts);
if (in_array('your_flag', $flags) {
    // Flag is present
}
benoît
quelle
1
danke für die -1! Diese Lösung arbeitet mit weniger Funktionen und weniger Code.
Benoît
1

Die hier akzeptierte Antwort ist sowohl falsch als auch richtig. Der Satz:

"WordPress verwirft alle Atts, die nicht standardmäßig angegeben sind."

Dies gilt nur für die shortcode_attsFunktion und nicht für die gesamte WP-Shortcode-Funktionalität.

Wenn Sie sich den folgenden Code ansehen:

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

Eine Short Nutzung wie [paragraph last] something [/paragraph]wird immer einen Wert falsefür die $isLastvar.

Das Problem ist , dass , wenn die shortcode_attsFunktion läuft es nicht die Attribute ohne Werte zu verwerfen. Sie befinden sich jedoch vor diesem Punkt absolut im $attsArray . A von als erste Zeile der Funktion würde erzeugen:var_dump$attscustom_shortcode_paragraph

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

Das 0. Element im Array ist also eine Zeichenfolge des Attributnamens, die in Kleinbuchstaben geschrieben werden muss.

Ändern wir stattdessen den Code wie folgt:

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

Sie haben jetzt $atts['last'] === true && $isLast === truefür den Shortcode:

[paragraph last] something [/paragraph]

Wenn Sie am Ende einen Wert hinzufügen, lautet der Shortcode:

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

würde yeild $atts['last'] === "any value at all" && $isLast === true. $lastwäre, falseweil das $attsArray am Anfang den Inhalt hat:

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

Der Wert des Array-Elements ist also nicht mehr der Attributname, und in_array('last', $atts) === falseder Standardwert shortcode_attsist false. aber das ist nur ein Standard , der von der Ist - Wert wird überschrieben any value at allund dann $atts['last'] !== falseist trueda "any value at all" !== false.

Alles in allem denke ich, dass dies das tut, was Sie wollen und unempfindlich gegen Benutzerfehler ist.

Infinity Media
quelle