创建了一个短代码,在一个页面上使用了两次(但不同),但只是输出了两次相同的代码

时间:2014-08-04 作者:TJ Sherrill

我创建了一个小快捷码,允许用户将自定义帖子类型的内容输出到另一个页面:[module name="foo"]

在给定页面上,我有:

[module name="foo"]
[module name="bar"]
然而,输出只是foo的两倍。

相关代码:

<?php 

// ASSUMING [module name="some-slug"]
function cpt_shortcode( $atts ){
    $a = shortcode_atts( array(
        \'name\' => \'something else\',
    ), $atts );

    if( false === ( $shortcode_post = get_transient( \'shortcode_post\' ) ) ) {

        $shortcode_post = new WP_Query( array(
            \'post_type\'     => \'module\',
            \'name\'          => $a[\'name\']
        ));
        set_transient( \'shortcode_post\', $shortcode_post, 60*60*4 );

    }
        if ($shortcode_post->have_posts())
            while ($shortcode_post->have_posts()):
                $shortcode_post->the_post();

                // WHICH MODULE
                $moduleType = get_field(\'module_type\');
                if($moduleType == \'basic\'){
                    include(\'module-basic.php\');
                } elseif($moduleType == \'cta\'){
                    include(\'module-cta.php\');
                } elseif($moduleType == \'grid\'){
                    include(\'module-grid.php\');
                } elseif($moduleType == \'carousel\'){
                    include(\'module-carousel.php\');
                }
            endwhile;
        else
            $out = "No modules match your shortcode";
        wp_reset_query();


    return html_entity_decode($out);

}
add_shortcode( \'module\', \'cpt_shortcode\' );


// KILL THE SHORTCODE TRANSIENT WHEN A NEW POST IS SAVED
function shortcode_delete_its_transients() {
        delete_transient( \'shortcode_post\' );
}

add_action( \'save_post\', \'shortcode_delete_its_transients\' );
这是gist.

1 个回复
最合适的回答,由SO网友:Milo 整理而成

您以两种不同的方式使用它,但您并没有创建唯一的瞬态名称,因此第二次运行短代码时,它只使用第一次运行短代码时在瞬态中保存的内容。

想出一些唯一识别瞬态的方法,例如:

set_transient( \'shortcode_post_\' . sanitize_key( $a[\'name\'] ), $shortcode_post, 60*60*4 );
也就是说,我不知道把结果保存到一个瞬间是否真的有多大好处。

结束

相关推荐

如果找到任何`Add_Shortcode()`,是否对_Content()应用筛选器以分隔内容?

我甚至不知道这是否可能array_map 或str_replace, 但想法如下:此函数用于获取发送前的内容,clean_custom_content, 这就是我不知道如何处理的地方。。所以让我们假设我们拥有所有的内容,这些内容将被包装在section 但每次都有一个简短的代码[] 这需要在输出短代码的内容时关闭。他们打开了一个新的section 并继续该页面的内容。有意义吗?任何想法或帮助都会很好。。谢谢function get_custom_content( $more_link_text = nul