Códigos cortos de WordPress en el lugar equivocado

3 minutos de lectura

avatar de usuario
zbyshekh

Estoy creando un complemento de wordpress y quiero usar códigos cortos para insertar un código bastante grande dentro de la publicación. Obtuve este código simple que simula mi problema.

function shortcode_fn( $attributes ) {
    wanted();
    return "unwanted";
}
add_shortcode( 'simplenote', 'shortcode_fn');

function wanted(){
    echo "wanted";
}

y publicar con este contenido

start
[simplenote]
end

que da este resultado:

wanted
start
unwanted
end

y quiero que inserte el texto “buscado” entre el inicio y el final. Sé que la solución más fácil sería simplemente devolver “buscado” en buscado(), pero ya tengo todas estas funciones y son bastante grandes. ¿Hay una solución fácil sin escribir todo desde cero?

@edit: ¿tal vez hay alguna forma de almacenar todos los ecos de la función en una cadena sin imprimirlos?

  • No creo que haya una forma de evitar esto, ya que las funciones para generar la salida del shortcode se ejecutan antes de la salida del contenido de la página/publicación, por lo tanto, el motivo por el que se muestra arriba en su ejemplo.

    – alarde de

    28 de abril de 2014 a las 6:59

Una solución fácil es usar Control de salida funciones:

function shortcode_fn( $attributes ) {
    ob_start(); // start a buffer
    wanted(); // everything is echoed into a buffer
    $wanted = ob_get_clean(); // get the buffer contents and clean it
    return $wanted;
}

  • Lo hice, y funciona parcialmente. El texto es visible entre el inicio y el final, pero también imprime la función antes del inicio. ¿Hay alguna forma de suprimirlo?

    – zbyshekh

    28 de abril de 2014 a las 8:42

  • Debería ser suprimido. Este es el código original: eval.in/143153 Resultado: inicio deseado final no deseado Esto es con almacenamiento en búfer de salida: eval.in/143155 Resultado: inicio buscado final no deseado

    – Ruslán Bes

    28 de abril de 2014 a las 9:09


  • Funciona, mi mal 🙂 Usé ob_get_content en su lugar, ahora funciona perfectamente

    – zbyshekh

    28 de abril de 2014 a las 9:30

  • muchas gracias, me salvó el tiempo

    – Lacas

    8 de febrero a las 12:49

avatar de usuario
rambu

Siga este enlace http://codex.wordpress.org/Shortcode_API#Resumen

Cuando se muestra the_content, la API de shortcode analizará cualquier shortcode registrado como “[myshortcode]”, separe y analice los atributos y el contenido, si los hay, y páseles la función de controlador de shortcode correspondiente. Cualquier cadena devuelta (sin eco) por el controlador de shortcode se insertará en el cuerpo de la publicación en lugar del propio shortcode.

Por lo tanto, todas las funciones de shortcode deben devolverse, puede cambiar su función “quería” a esto:

function wanted(){
    return "wanted";
}

avatar de usuario
matt gibson

La forma estándar de WordPress sería proporcionar dos funciones. Una, get_wanted() haría devolver la cadena buscada; el otro, wanted()es solo:

function wanted() {
    echo get_wanted();
}

Entonces puede hacer cualquiera de las dos cosas, pero solo tiene la mayor parte del código en un solo lugar. Este es un patrón común en WordPress, por ejemplo the_title() versus get_the_title().

Como menciona @Ruslan, la forma más estándar sin reescribir su función existente para construir una cadena sería usar el control de salida.

Usando la respuesta de Ruslan Bes, el código se ve así:

function shortcode_fn( $attributes ) {
    ob_start(); // start a buffer
    wanted(); // everything is echoed into a buffer
    $wanted = ob_get_clean(); // get the buffer contents and clean it
    return $wanted;
}

add_shortcode( 'simplenote', 'shortcode_fn');

function wanted(){
    echo "wanted";
}

¿Ha sido útil esta solución?