apply_filters('the_content', $content) vs do_shortcode($content)

3 ene 2015, 12:48:35
Vistas: 99.8K
Votos: 25

Digamos que tengo una opción del tema o un área de texto de postmeta personalizado. Ahora quiero ejecutar múltiples shortcodes, textos generales, imágenes, etc.

¿Cuál sería la mejor práctica y por qué?

Opción 1:

$content = //datos de mi área de texto;
echo apply_filters('the_content', $content);

Opción 2:

$content = //datos de mi área de texto;
echo do_shortcode($content);

Por favor, explíquenme cuál sería la mejor práctica y por qué.

EDICIÓN

Permítanme describir el escenario en detalle. Desarrollo temas para clientes según sus requisitos. A veces, necesito agregar meta datos en posts/páginas/tipos de posts personalizados, para que puedan agregar shortcodes (slider, formulario de contacto, etc.) o simplemente un texto simple. Es un campo de texto.

Para hacer que el shortcode funcione, uso la opción 1. Ahora, escuché de alguien que esta es una forma incorrecta y que debería usar do_shortcode. Pero no me dieron una explicación de por qué es una forma incorrecta. Es por eso que estoy preguntando.

Todo este proceso se puede hacer en el editor de texto predeterminado de WordPress. Pero necesito crear esas opciones para uso específico de plantillas, que es lo que quieren mis clientes.

0
Todas las respuestas a la pregunta 2
7
17

PREGUNTA Y RESPUESTA REVISITADAS

A veces hay preguntas que te persiguen y te atormentan más tarde en la vida, y esta es una de esas preguntas.

Esta pregunta me hizo pensar en una solución alternativa al problema. Como ya mencioné, los campos personalizados y las meta cajas están ahí para almacenar pequeños fragmentos de metadatos, y no para actuar como una extensión del contenido del post donde puedes ejecutar shortcodes y funciones. Además, como ya dije, tu método es incorrecto y no debería usarse.

Me pareció interesante en tu post que usaste campos personalizados y meta cajas para mostrar inadvertidamente contenido personalizado de la entrada del usuario. Así que me senté y pensé en una posible manera de hacer que esto funcione y usar correctamente los datos del campo personalizado y la meta caja.

Esta es mi idea:

EL ESCENARIO:

NOTA: Esto puede modificarse para adaptarse a cualquier necesidad

En un post individual, un usuario quiere/requiere mostrar contenido personalizado dinámicamente después del post para satisfacer sus necesidades. Esto debe ser dinámico. El contenido debe ser una consulta personalizada, y el usuario necesita elegir qué mostrar cuando quiera y lo que desee.

LA POSIBLE SOLUCIÓN:

Los shortcodes no funcionarán aquí, ya que no se pueden ejecutar en campos personalizados. Tampoco funcionará do_shortcode, ya que no es dinámico y está codificado, algo que no queremos. Como en tu pregunta, vamos a hacer uso de un campo personalizado. Nuevamente enfatizo, no uses el campo personalizado para ejecutar una consulta personalizada o shortcodes.

EL PLAN:

Usaremos el campo personalizado solamente para guardar nuestros argumentos de consulta; eso es todo. Entonces, creamos un campo personalizado llamado custom_query_arguments. En tu pantalla de edición de posts, ahora verás tu campo personalizado, listo para usar.

El siguiente paso será agregar nuestros argumentos de consulta personalizados a nuestro campo. Digamos que necesitamos mostrar tres posts de la categoría 1 ordenados por título. Entonces, nuestros argumentos de consulta deberían verse así (en formato de cadena):

'posts_per_page=3&cat=1&orderby=title'

Esto es lo que debes ingresar ahora en tu campo personalizado. Una vez ingresado, guarda el valor de tu campo personalizado.

Lo siguiente será construir la consulta personalizada en tu single.php. Necesitamos obtener el valor de nuestro campo personalizado, que en realidad son nuestros argumentos de consulta, y alimentar eso a una nueva instancia de WP_Query para recuperar los posts. También necesitamos verificar si realmente tenemos un valor guardado en ese campo personalizado, si el campo personalizado está vacío, no mostrar nada.

EL CÓDIGO:

Puedes probar algo como esto en el archivo single.php justo después del post individual.

$args = get_post_meta( get_queried_object_id(), 'custom_query_arguments', true );
// Verificar si el campo personalizado tiene un valor
if( ! empty( $args ) ) {

    $q = new WP_Query( $args );

    if( $q->have_posts() ) {
        while( $q->have_posts() ) {
            $q->the_post();

            the_title();
        }
        wp_reset_postdata();
    }
}

Si el usuario quiere eliminar la consulta personalizada, simplemente puede borrar el valor del campo personalizado y dejarlo en blanco. Si necesita mostrar la misma consulta, pero de la categoría 10 y un total de 5 posts, puede reemplazar el valor original con lo siguiente:

'posts_per_page=5&cat=10&orderby=title'

ALGUNAS NOTAS:

Es importante usar la sintaxis y el formato correctos al ingresar información en estos campos personalizados y meta cajas. Errores de sintaxis o información incorrecta llevarán a resultados no deseados o incluso errores fatales. Es importante informar a tus clientes sobre esta información.

RESPUESTA ORIGINAL

No entiendo lo que intentas lograr, pero por lo que puedo decirte, esas son dos cosas separadas.

OPCIÓN 1

apply_filters('the_content', $content); se usa para aplicar los filtros de contenido al contenido del post sin filtrar, que generalmente proviene del uso de $post->post_content. Estos filtros incluyen el famoso filtro wp_autop que agrega etiquetas p a the_content()

apply_filters('the_content', $content); generalmente se usa junto con get_posts donde se trabaja directamente con los objetos WP_Post sin usar setup_postdata( $post ) que hace que las etiquetas de plantilla como the_content() estén disponibles para su uso.

OPCIÓN 2

do_shortcode se usa para agregar un shortcode en cualquier lugar de los archivos de plantilla fuera del editor de texto en la pantalla del editor de páginas en el back end, básicamente filtrando shortcodes a través de sus hooks.

El uso correcto es el siguiente.

Ejemplo: Agregar el shortcode de galería en un archivo de plantilla

echo do_shortcode( '[gallery]' )

EDIT 1

Por tus comentarios, no usaría un shortcode en absoluto entonces.

Si no vas a agregar un shortcode a través del editor de texto y lo vas a agregar directamente (codificado) a través de do_shortcode en un archivo de plantilla. Preferiría entonces simplemente agregar la función a la plantilla.

Ejemplo:

Si tienes la siguiente función de shortcode,

function footag_func( $atts ) {
    return "foo = {$atts['foo']}";
}
add_shortcode( 'footag', 'footag_func' );

Puedes simplemente llamar a la función directamente en una plantilla como:

echo footag_func();

Es mucho más rápido de esta manera ya que el shortcode no necesita ser analizado.

EDIT 2

Para ser honesto aquí, estás haciendo esto completamente mal desde tu edición. Por eso no pude entender tu pregunta inicial

A veces, necesito agregar metadatos en posts/páginas/tipos de posts personalizados, para que puedan agregar shortcodes (slider, formulario de contacto, etc.) o simplemente un texto. Es un campo de texto.

Para hacer que el shortcode funcione, uso la opción 1.....

Los campos personalizados no son campos de texto y seguramente no están destinados a usarse para ejecutar shortcodes y, para el caso, sliders o formularios de contacto. Los campos personalizados nunca deben usarse para reemplazar el editor de texto en posts y páginas.

Como dije antes, apply_filters('the_content', $content); está destinado a usarse para aplicar formato al contenido del post sin procesar.

Tienes dos opciones aquí

  • Usar do_shortcode directamente en archivos de plantilla, lo cual no recomendaría ya que usar la función es más rápido porque el shortcode no necesita ser analizado.

  • Usar el shortcode directamente en el editor de texto para la página/post particular

Recomendaría seriamente que des un nuevo vistazo a tus estructuras y lo que quieres lograr. Los campos personalizados no son editores de texto y no pueden ejecutar shortcodes o sliders.

Mi recomendación sería que tal vez mires widgets personalizados o un sistema que puedas usar con campos personalizados.

3 ene 2015 13:43:33
Comentarios

Pieter gracias por la explicación. Ya lo sé. Pero estaba preguntando, qué opción será más precisa si el objetivo es solo mostrar shortcodes desde un textarea de post meta/opciones del tema. Estoy usando la opción 1 para obtener el contenido filtrado, y se ha convertido en un hábito para mí. Y uso la opción 1 incluso solo para imprimir un shortcode desde un campo de texto. Así que estaba preguntando.

тнє Sufi тнє Sufi
3 ene 2015 14:06:00

Vi la edición. Entiendo tu punto. Pero mi escenario es diferente. Es como, hay un campo de texto/área, y varios shortcodes. Ahora el usuario puede poner cualquiera de los shortcodes en esa área. Así que no puedo usar directamente una función. Necesito mantener esa parte dinámica.

тнє Sufi тнє Sufi
3 ene 2015 15:29:54

¿Dónde está ese campo de texto, es el mismo que en la pantalla del editor de páginas del backend?

Pieter Goosen Pieter Goosen
3 ene 2015 15:34:43

Puede ser un meta de publicación. O puede ser una opción del tema. Uso el filtro the_content para ambos.

тнє Sufi тнє Sufi
3 ene 2015 15:36:08

Lo siento, pero entonces nada de esto tiene sentido. ¿Por qué querrías usar shortcodes en campos personalizados? ¿Por qué incluso usarías shortcodes en absoluto?

Pieter Goosen Pieter Goosen
3 ene 2015 15:41:03

Por favor, revisa la parte editada de la pregunta.

тнє Sufi тнє Sufi
3 ene 2015 15:43:31

Por favor, consulta mi edición en "PREGUNTA Y RESPUESTA REVISITADA"

Pieter Goosen Pieter Goosen
5 ene 2015 14:40:59
Mostrar los 2 comentarios restantes
1

apply_filter('the_content') ejecuta todos los filtros adjuntos a la salida de contenido de WordPress como do_shortcode, wp_autop y más.

apply_filters es un método perfectamente válido para hacer lo que deseas, sin embargo, si solo quieres un reemplazo de shortcode y ninguno de los otros filtros, entonces usa la Opción 2 de tu pregunta.

3 feb 2021 21:00:08
Comentarios

Esta es realmente toda la información que necesitas para entender esto en 2 oraciones.

squarecandy squarecandy
4 ene 2024 18:12:04