是否在侧边栏中显示POST短码内容?

时间:2011-04-04 作者:dashaluna

我需要根据页面在侧边栏中显示图像和其他内容。页面是动态添加的,每个页面需要在侧边栏中显示的信息是不同的。所以我无法预测会发生什么。因此,我们的想法是像往常一样拥有一个页面的内容(包含所有必要的短代码),然后在页面内容的末尾拥有一个短代码,其中包含需要显示在该页面侧边栏中的所有信息。

原始问题:有选择地显示短代码(在主要内容中取消显示,而是在侧边栏中显示)我想知道是否有可能“有选择地”显示短代码。

例如,一个特定的短代码,我们称之为[sc], 在页面内容中指定。现在,当显示该页面的内容时,我想抑制特定的[sc] 短代码,但从该页面的侧栏中显示它。页面内容将具有其他短代码。我只想选择性地显示[sc] 短代码和像往常一样处理其他短代码-即其他短代码将在页面内容中处理。

这可能吗?如何做到这一点?

5 个回复
最合适的回答,由SO网友:Jan Fabry 整理而成

短代码处理程序不必返回任何内容,它只需修改一个全局变量,您可以稍后在侧栏小部件中读取该变量。如果边栏显示在帖子内容之后(很可能是右侧边栏),则可以毫无问题地完成此操作。如果边栏显示在帖子内容之前,则更为复杂:在调用小部件时,必须开始输出缓冲,等待页面的其余部分显示出来,然后处理短代码内容并刷新输出缓冲区。

一个简单的“概念证明”,它不在帖子中而是在页脚中显示短代码内容:

$wpse13925_shortcode_content = array();

add_shortcode( \'13925\', \'wpse13925_shortcode\' );
function wpse13925_shortcode( $shortcode_attr, $shortcode_content )
{
    $GLOBALS[\'wpse13925_shortcode_content\'][] = $shortcode_content;
    return \'\';
}

add_action( \'wp_footer\', \'wpse13925_footer\' );
function wpse13925_footer()
{
    var_dump( $GLOBALS[\'wpse13925_shortcode_content\'] );
}

SO网友:dashaluna

我的解决方案基于Jan Fabry\'s 答复我没有小部件,但有简单的模板文件。

因此,我所做的是:

指定了需要在页面内容本身包装的侧栏中显示的所有信息[sidebar_content] 短代码。

在函数中指定了以下函数。php。这扩展了[sidebar_content], 但不显示任何内容,而是将其保存在全局变量中。

global $sidebar_content;
add_shortcode("sidebar_content", "my_sidebar_content");
function my_sidebar_content($atts, $content = null){
    global $sidebar_content;
    if( !empty($content) ){
        $sidebar_content = do_shortcode($content);
    }
    return "";
}
中的sidebar.php. 我有以下代码:

global $sidebar_content;
if( isset($sidebar_content) && !empty($sidebar_content) ){
  echo $sidebar_content;
}

SO网友:Wyck

您可以使用条件标记和do\\u短代码。http://codex.wordpress.org/Function_Reference/do_shortcode
http://codex.wordpress.org/Conditional_Tags

ID为12的单个页面的简单示例。

if is_single(12){
do_shortcode(\'[shortcode]\');
}
如果您自己编写了这个短代码,则可以创建一个函数来为其提供一个显示参数,如[shortcode(\'page=5, 6, 7\', \'category\', \'exclude=posts\', \'whatever\')]

SO网友:Bainternet

可以基于自定义字段执行此操作,例如,创建一个名为sc_no_show 并赋予它真实的价值。然后在shortcode函数中执行以下操作:

function what_ever(){
    global $post;
    $no_show = get_post_meta($post->ID,\'sc_no_show\',true);
    if ($no_show)
        return \'\';
    //add your normal shortcode stuff here
}
现在,在每个页面或帖子上都有一个名为sc_no_show 价值为true 它不会显示/

SO网友:t31os

您可以使用一些位置良好的操作来查找您的短代码,如果发现了,请设置一个标志并运行其他操作,首先剥离该短代码的内容,然后再运行一个辅助操作来执行侧栏中的该短代码。除此之外,您还可以在侧边栏文件中创建自己的简单操作,并在需要打印快捷代码时将其挂接。

没有跟踪?不要怪你,我并不总是善于解释想法,所以这里有一个代码形式的示例。。

首先,在想要显示快捷代码内容的侧栏中,添加类似。。

<?php do_action( \'special_shortcode_content\' ); ?>
现在我们有了一个可以在设置标志时挂钩的操作。

接下来,我们需要扫描帖子,在循环发生之前,检查是否存在特定的短代码,我将使用[sc] 根据您的示例,我们可以通过the_posts. 我宁愿将代码封装到一个类中,并在类中定义一个类变量作为标志,而不是使用全局变量。

class Page_Shortcode_to_Sidebar {
    private $has_shortcode = false;
    public function __construct() {
        if( is_admin() )
            return;

        add_action( \'the_posts\', array( $this, \'check_for_shortcode\' ) );
        add_filter( \'the_content\', array( $this, \'remove_shortcode\' ), 1 ); 
    }
    public function check_for_shortcode( $posts ) {
        if( empty( $posts ) )
            return $posts;

        if( !is_page() )
            return $posts;

        foreach( $posts as $post ) {
            if( !stripos( $post->post_content, \'[sc]\' ) )
                continue;
            $this->has_shortcode = true;
        }
        return $posts;
    }
    public function remove_shortcode( $content ) {

        if( !$this->has_shortcode )
            return $content;

        $content = str_replace( \'[sc]\', \'\', $content );
        add_action( \'special_shortcode_content\', array( $this, \'do_shortcode\' ) );

        return $content;
    }
    public function do_shortcode() {
        ?>
        <li><?php do_shortcode(\'[sc]\'); ?></li>
        <?php
    }
}

$Page_Shortcode_to_Sidebar = new Page_Shortcode_to_Sidebar;
所以基本上是这样的。。

上的回调the_posts 检查每个帖子的短代码,如果找到,则设置标志the_content 稍后执行,并检查是否设置了标志如果您指的是您自己创建的短代码,并且它是以这种方式使用的。。

[sc]something[/sc]
。。然后,您将需要更智能的工具来从帖子内容中删除短代码内容。

如果不是这样使用的,那么我上面提供的应该可以很好地完成这项工作。

希望有帮助:)

结束

相关推荐

ShortCode and extra </p>

[box id=“1”text=“一些文本”]短代码在某一点上是输出文本html结果为:</p> some text </p>开头有一个额外的结束段落,结尾有一个开头。。。为什么?这些是从哪里来的?。。。。有什么想法吗?。。它搞砸了我的w3验证!**注意我发现。。。但在我看来,一切都“修补”了。。。任何干净的溶液。。。wp脏了吗?reference