¿Cómo uso Shortcodes dentro de etiquetas HTML?
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)
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.

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.

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

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

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.

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>
.

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í.

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!
