Extendiendo los atributos de Shortcode

2

He buscado en muchos lugares y he intentado de muchas maneras, pero sin éxito.

Tengo un código abreviado en mi tema WP como;

[recent_posts layout="thumbnails-on-side" columns="4" number_posts="4" offset="" cat_slug="" exclude_cats="" thumbnail="yes" title="no" meta="no" excerpt="no" excerpt_length="35" strip_html="yes" animation_type="0" animation_direction="down" animation_speed="0.1" class="" id=""][/recent_posts]

(Es el código corto de las publicaciones recientes del tema Avada). En el núcleo, este shortcode se ejecuta

WP_Query( $args )
Función

para obtener publicaciones. Pero este shortcode no se puede usar con tipos de publicaciones personalizadas porque los codificadores no asignaron el atributo 'post_type' a shortcode $ args (por lo tanto, debido a que el valor predeterminado es 'posts', shortcode solo obtiene publicaciones estándar).

Como resultado, me gustaría extender / definir una nueva versión extendida de este shortcode para agregar el atributo 'post_type' como una variable (porque me gustaría usarlo para muchos tipos de publicaciones personalizadas) . ¿Cómo puedo hacer eso? Gracias.

    
pregunta Alper 03.05.2015 - 01:17

2 respuestas

4

Sin ver tu código es difícil darte una respuesta exacta. Existe el filtro shortcode_atts_{$shortcode} que se introdujo en Wordpress 3.6. Todos los atributos se ejecutan a través de este filtro. Debe tenerse en cuenta que el parámetro $shortcode debe configurarse en shortcode_atts . Aún no he visto códigos cortos que tienen este conjunto de parámetros.

Su problema aquí es en realidad mayor que los atributos, ya que necesitará agregar el atributo y el parámetro post_type a sus argumentos de consulta. Si el autor no proporcionó un filtro personalizado para los argumentos de la consulta, entonces se encuentra en una calle sin salida.

OMI, tienes dos opciones aquí

  • Comuníquese con el autor del tema y pídale que lo haga en el código correspondiente al código corto en su próxima actualización. No creo que él / ella tenga un problema ya que esto agrega valor al código corto

  • Crea un tema secundario y copia el shortcode al tema secundario. Modifique el código abreviado según sea necesario y recuerde cambiar el nombre de la función y el nombre del código abreviado en consecuencia. De esta manera, tendrá un código abreviado que se ajuste a sus necesidades

respondido por el Pieter Goosen 03.05.2015 - 08:57
4

Aquí hay solo una adición a la respuesta de @PieterGoosen.

Hay pocos métodos para modificar el tipo de publicación de WP_Query , que está dentro de un código abreviado. Supongamos que es [recent_posts] .

Método A) Si el código abreviado utiliza el tercer parámetro de shortcode_atts() (como se mencionó @PieterGoosen) para el ejemplo wpse , entonces:

/**
 * Method A: Using the shortcode_atts_$shortcode filter + pre_get_posts action
 */

add_filter( 'shortcode_atts_wpse', function ( $out, $pairs, $atts )
{
    if( isset( $atts['post_type'] ) && $post_type = $atts['post_type'] )
    {
        add_action( 'pre_get_posts', function ( $q ) use ( $post_type )
        {
            static $activated = false;
            if( ! $activated )
            {
                $q->set( 'post_type', santize_key( $post_type ) );
                $activated = true;
            }
        }
    }       
    return $out;
} );

Aquí puede ver mi otra respuesta sobre cómo usar este filtro.

Método B) De lo contrario, podemos volver a registrar el shortcode con una nueva devolución de llamada.

Cambíalo de old_recent_posts a new_recent_posts :

/**
 * Method B: Re-register the shortcode
 */

add_action( 'after_setup_theme', function()
{
    if( function_exists( 'old_recent_posts' ) )
    {
        remove_shortcode( 'recent_posts', 'old_recent_posts' );
        add_shortcode(    'recent_posts', 'new_recent_posts' );
    }

} );

function new_recent_posts( $atts = [], $content = '' )
{
    if( isset( $atts['post_type'] ) && $post_type = $atts['post_type'] )
    {
        add_action( 'pre_get_posts', function ( $q ) use ( $post_type )
        {
            static $activated = false;
            if( ! $activated )
            {
                $q->set( 'post_type', santize_key( $post_type ) );
                $activated = true;
            }
        }
    }       
    return old_recent_posts( $atts = [], $content = '' );
}

Aquí puede ver cómo @toscho reemplaza la devolución de llamada de shortcode, en la misma pregunta que mi respuesta vinculada arriba .

Tenga en cuenta que no probé esto, pero espero que pueda ajustar esto a sus necesidades.

    
respondido por el birgire 03.05.2015 - 13:21

Lea otras preguntas en las etiquetas