扩展短码属性

时间:2015-05-02 作者:Alper

我找了很多地方,尝试了很多方法,但都没有成功。

我在我的WP主题中有一个短代码,如;

[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]
(这是Avada theme最近发布的短代码)。在核心中,执行此短代码

WP_Query( $args )
函数获取帖子。但此短代码不能用于自定义帖子类型,因为编码器没有将“Post\\u type”属性设置为短代码$args(因此,由于默认值为“posts”,短代码仅获取标准帖子)。

因此,我想扩展/定义此快捷码的新扩展版本,以添加“post\\u type”属性as a variable (因为我想将其用于许多自定义帖子类型)。我该怎么做?谢谢

2 个回复
最合适的回答,由SO网友:Pieter Goosen 整理而成

如果没有看到您的代码,就很难给出准确的答案。这里有shortcode_atts_{$shortcode} Wordpress 3.6中引入的过滤器。所有属性都将通过此过滤器运行。必须指出的是$shortcode 需要在中设置参数shortcode_atts. 我还没有看到设置了这个参数的短代码。

这里的问题实际上更大,只需要属性,因为您需要添加属性和post_type 查询参数的参数。如果作者没有为查询参数提供自定义过滤器,那么您就陷入了死胡同。

依我看,你有两个选择

联系主题作者,让他在下一次更新中找到相关的代码。我认为他/她不会有任何问题,因为这会增加短代码的价值

创建子主题并将快捷码复制到子主题。根据需要修改短代码,并记住相应地更改函数名称和短代码名称。这样,您将有一个适合您需要的短代码

SO网友:birgire

这里是对@PieterGoosen的答案的补充。

有几种方法可以修改WP_Query, 这在一个短代码中。让我们假设[recent_posts].

Method A) 如果短代码使用shortcode_atts() (正如@PieterGoosen提到的)例如wpse, 然后:

/**
 * 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;
} );
Here 你可以看到我关于如何使用这个过滤器的另一个答案。

Method B) 否则,我们可以用一个新的回调重新注册短代码。

将其更改为old_recent_postsnew_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 = \'\' );
}
Here 您可以看到@toscho如何替换短代码回调,问题与我上面的链接答案相同。

请注意,我没有对此进行测试,但希望您可以根据自己的需要进行调整。

结束

相关推荐

Multiple level shortcodes

我正在开发一个插件,遇到了一种情况,我希望有人能帮我找到一个解决方案。我想要一个短代码结构,如:[shortcode_1] [shortcode_2] [shortcode_3] [shortcode_4][/shortcode_4] [/shortcode_3] [/shortcode_2] [/shortcode_1] 但如果我使用add\\u短代码,只有第一个短代码有效。。。有没有办法得到这样的短代码结构?谢谢