Estendendo os atributos do Shortcode

2

Eu pesquisei muitos lugares e tentei muitas maneiras para isso, mas não tive sucesso.

Eu tenho um shortcode no meu 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]

(É o shortcode posts recentes do tema Avada). No núcleo, este shortcode executa

WP_Query( $args )

função para obter posts. Mas este shortcode não pode ser usado com Custom Post Types porque os codificadores não colocaram o atributo 'post_type' em shortcode $ args (então, devido ao valor padrão ser 'posts', o shortcode só pega posts padrão).

Como resultado, eu gostaria de estender / definir uma nova versão estendida deste shortcode para adicionar o atributo 'post_type' como uma variável (porque eu gostaria de usá-lo para muitos tipos de post personalizado) . Como eu posso fazer isso? Obrigado.

    
por Alper 03.05.2015 / 01:17

2 respostas

4

Sem ver seu código, é difícil dar uma resposta exata. Existe o filtro shortcode_atts_{$shortcode} que foi introduzido no Wordpress 3.6. Todos os atributos são executados através deste filtro. É necessário observar que o parâmetro $shortcode precisa ser definido em shortcode_atts . Eu ainda não vi códigos de acesso que possuem esse parâmetro definido.

Seu problema aqui é realmente maior que apenas os atributos, pois você precisará adicionar o atributo e o parâmetro post_type aos seus argumentos de consulta. Se o autor não forneceu um filtro personalizado para os argumentos da consulta, você está em uma rua sem saída.

IMO, você tem duas opções aqui

  • Entre em contato com o autor do tema e peça a ele no código relevante para o shortcode em sua próxima atualização. Eu não acho que ele / ela terá um problema, pois isso agrega valor ao shortcode

  • Crie um tema filho e copie o shortcode para o tema filho. Modifique o shortcode conforme necessário e lembre-se de alterar o nome da função e o nome do shortcode de acordo. Desta forma, você terá um shortcode que atenda às suas necessidades

por Pieter Goosen 03.05.2015 / 08:57
4

Aqui está apenas uma adição à resposta da @PieterGoosen.

Existem alguns métodos para modificar o tipo de postagem de WP_Query , dentro de um shortcode. Vamos supor que seja [recent_posts] .

Método A) Se o shortcode usar o terceiro parâmetro do shortcode_atts() (como @PieterGoosen mencionado) por exemplo wpse , então:

/**
 * 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;
} );

Aqui você pode ver minha outra resposta sobre como usar este filtro.

Método B) Senão, podemos registrar novamente o shortcode com um novo retorno de chamada.

Altere de old_recent_posts para 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 = '' );
}

Aqui você pode ver como @toscho substitui o retorno de chamada de código de acesso, na mesma pergunta da minha resposta vinculada acima .

Note que eu não testei isso, mas espero que você possa ajustar isso às suas necessidades.

    
por birgire 03.05.2015 / 13:21