¿Cómo uso Shortcodes dentro de etiquetas HTML?

5 oct 2016, 17:38:55
Vistas: 55K
Votos: 5

Intenté incluir shortcodes con un parámetro en la salida HTML sin procesar, como se muestra a continuación:

<a href="https://example.com/folder/edit.php?action=someaction&id=[foocode parameter='value']&edittoken=[foocode parameter='othervalue']">texto del enlace</a>

Esto hace que la función PHP do_shortcode() falle.

¿Es realmente imposible hacer esto con shortcodes?

La descripción del método contiene una advertencia:

Los usuarios con capacidad unfiltered_html pueden obtener una salida inesperada si los símbolos de mayor y menor que están anidados en las etiquetas.

Sin embargo, que PHP falle no es el tipo de salida inesperada que debería poder ocurrir.

PD: La función que se está llamando es

function echocode( $atts ){
    return "Hola Mundo";
}

y se agrega como

add_shortcode("foocode", "echocode");

La función nunca se ejecuta. (No se imprime ningún echocode al inicio)

2
Comentarios

Una función de callback para shortcode no debe usar echo para nada, debe retornar un string.

fuxia fuxia
5 oct 2016 18:07:16

Incluso sin usar echo y con el método simplemente retornando "", sigue fallando.

ApolloLV ApolloLV
5 oct 2016 18:20:10
Todas las respuestas a la pregunta 5
4

los shortcodes no están permitidos en atributos HTML, los shortcodes no son un lenguaje de programación, son marcadores de posición para contenido HTML adecuado.

5 oct 2016 18:18:48
Comentarios

En realidad están permitidos, ya que el método tiene una opción para ignorar o no los shortcodes dentro de las etiquetas HTML. Si no estuvieran permitidos, el método debería ignorar todos los shortcodes dentro de las etiquetas HTML por razones de estabilidad.

ApolloLV ApolloLV
5 oct 2016 18:24:04

si eres el experto, ¿por qué preguntas? :( no están permitidos, punto final. Puedes escribir tu propio análisis de contenido si lo deseas usando cualquier API que quieras, pero si alguna vez pretendes que un usuario lo use realmente, fallará. Esta es una característica de la versión 4.3 o 4.4, antes de eso era posible, y se cambió debido a "abusos" del tipo que muestras en tu código. Puedes hacer que funcione, pero esto no es compatible con el núcleo, por lo que nunca sabrás cuándo lo que hagas empezará a fallar.

Mark Kaplun Mark Kaplun
5 oct 2016 18:28:38

Gracias, eso era exactamente el tipo de información que estaba buscando :D

ApolloLV ApolloLV
5 oct 2016 18:50:01

me alegra ayudar, no te tomes a mal mi mal humor ;)

Mark Kaplun Mark Kaplun
5 oct 2016 18:52:49
0

Espero que esto ayude a alguien:

En lugar de hacer esto: <a href="https://example.com/folder/edit.php?action=someaction&id=[foocode parameter='value']&edittoken=[foocode parameter='othervalue']">texto del enlace</a>

Puedes hacer esto: [foocode parameter1=value parameter2=othervalue] y luego hacer esto:

add_shortcode( 'foocode', 'prefix_foocode' );

function prefix_foocode( $atts ) {

    // Normalizar $atts, establecer valores por defecto y hacer lo que quieras con $atts.

    $html = '<a href="https://example.com/folder/edit.php?action=someaction&id=' . $atts['parameter1'] .'&edittoken=' . $atts['parameter2'] . '">texto del enlace</a>';
return $html;
}
18 mar 2017 23:59:22
2

Por lo que vale, los shortcodes que no aceptan ningún parámetro parecen funcionar dentro de etiquetas HTML. Son los que tienen parámetros los que no funcionan.

Ej: <a href="https://example.com/folder/edit.php?action=someaction&id=[foocode parameter='value']&edittoken=[foocode parameter='othervalue']">linktext</a> no funciona

Ej: <a href="https://example.com/folder/edit.php?action=someaction&id=[foocode]&edittoken=[foo-other-code]">linktext</a> sí funciona (al menos en mi caso)

He utilizado un shortcode simple como este para generar la ruta de las imágenes en mi sitio y así no tener que recordar la ruta cada vez (no uso el gestor de medios).

Espero que esto ayude a alguien que pueda encontrarse con esta pregunta más adelante.

9 jul 2017 16:13:14
Comentarios

Parece que está usando las mismas comillas para el atributo HTML y los atributos del shortcode lo que crea problemas. <a href="[mytest attribute='1234']">test</a> funciona, al igual que <a href="[mytest attribute=1234]">test</a> o <a href='[mytest attribute="1234"]'>test</a>.

janh janh
30 ene 2018 10:57:08

Es bueno saberlo. No recuerdo si lo intenté antes, pero es posible que hayan cambiado o arreglado algo desde el verano pasado cuando escribí esto. Gracias por intervenir.

Crazycoolcam Crazycoolcam
30 ene 2018 14:55:06
2

Por favor, prueba con esto:

<a href="https://example.com/folder/edit.php?action=someaction&id=<?php echo do_shortcode("[foocode parameter='valor']"); ?>&edittoken=<?php echo do_shortcode("[foocode parameter='otrovalor']"); ?>">textodelenlace</a>
5 oct 2016 19:40:11
Comentarios

Esto podría funcionar si se codifica en un archivo o función (function.php, una plantilla, etc.), pero no funcionaría si se codifica en el editor TinyMCE ya que PHP se elimina automáticamente allí.

Ian Ian
19 mar 2017 06:37:56

@Ian exactamente - el propósito de los shortcodes es permitir que los usuarios finales (editores) agreguen contenido dinámico en el editor; usar php frustra completamente el propósito.

Peter Kionga-Kamau Peter Kionga-Kamau
27 dic 2018 20:56:04
0

Para ejecutar el shortcode dentro del elemento HTML crudo, tendrías que encontrar la función de callback que se llama a través del shortcode y luego hacer un echo de esa función en el elemento HTML crudo.

Por ejemplo, si tu shortcode es [foo_code], entonces descubre qué función se llama cuando se ejecuta este shortcode buscando el add_shortcode() para este shortcode (en este caso [foo_code]):

add_shortcode('foo_code', 'foo_callback_function');

Ahora, cuando sepas qué función se está llamando, simplemente puedes hacer un echo de esta función en el HTML crudo así:

[echo foo_callback_function();]

Para más detalles sobre por qué funciona, revisa esta respuesta. ¡Espero que ayude!

18 mar 2018 18:48:42