如何将短码输出返回到内容的顶部?

时间:2012-12-31 作者:Joshua Richards

我有一个名为update的短代码,如下所示

[update title=\'\' date=\'\'] this is some update, etc. etc. 2 paragraphs or more [/update]
这将输出一些html,将标题、日期和内容封装在一些html中。

同时,我希望在内容顶部弹出一行,只输出标题和日期,并使用一个跳转到创建更新的点的锚。

我看了很多东西,但我似乎找不到一种方法将短代码定位在内容上方。

感谢您的帮助!

非常感谢。

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

比我的第一个建议更简洁的方法是:

运行短代码处理程序两次:1。在解析内容之前,2。在常规内容解析期间使用\'the_post\' 作为第一个条目。否则,当小部件或其他代码使用the_content 过滤器。

add_shortcode( \'test\',  array ( \'WPSE_77804_Shortcode\', \'shortcode_handler\' ) );
add_action( \'the_post\', array ( \'WPSE_77804_Shortcode\', \'store_output\' ) );

class WPSE_77804_Shortcode
{
    protected static $storage = \'\';

    public static function store_output( $post )
    {

        // maybe someone else has done this already, so we don\'t have to try again.
        \'\' === self::$storage && do_shortcode( $post->post_content );

        \'\' !== self::$storage
            && add_filter( \'the_content\', array ( __CLASS__, \'prepend_content\' ) );
    }

    public static function shortcode_handler( $attrs, $content = \'\' )
    {
        if ( \'\' === self::$storage )
        {
            if ( isset ( $attrs[\'title\'] ) )
                self::$storage .= $attrs[\'title\'];

            if ( isset ( $attrs[\'date\'] ) )
                self::$storage .= \' \' . $attrs[\'date\'];
        }

        // you might do much more here and return the complete string
        return \'|\' . self::$storage . \'|\' . $content;
    }

    public static function prepend_content( $content )
    {
        return self::$storage . \'<hr>\' . $content;
    }
}
相关的answer for galleries.

SO网友:Ed Burns

处理这个问题的方法似乎是在主题函数中使用全局数组。php,并在处理其中一个短代码时添加到其中。最后,可以使用\\u内容上的过滤器将额外链接放置在顶部。

首先初始化全局:

add_action( \'after_setup_theme\', \'update_init\' );
function update_init() {
    global $update_links;
    $update_links = array();
}
然后将以下代码添加到快捷码处理函数中:

global $update_links;
$update_links[] = "<a href=\'#$title-$date\'>$title - $date</a>";
上面还假设您的短代码替换包括$title-$date的锚定标记。

最后,添加内容过滤器以将更新链接添加到您的内容:

add_filter( \'the_content\', \'the_content_update_links\', 90);    
function the_content_update_links($content) {
    global $update_links;
    if(count($update_links)) $content = implode("<br />", $update_links).$content;
    return $output;
}
您可以更改链接的组合方式—我只是在它们之间加了一个分隔符,但循环创建无序列表或将链接包装在div中很简单。

SO网友:Bainternet

您可以使用the_content 过滤挂钩并在其余内容之前将其返回:

add_filter(\'the_content\',\'update_shortcode_catch\',10);
function update_shortcode_catch($content){
    //early exit if not found
    if (strpos($content, \'[update\') === false)
        return $content;

    //extract shortcode (could use regex)
    $shortcode_start = explode(\'[update\', $content);
    $shortcode_end = explode(\'[/update]\', $shortcode_start[1]);
    $shortcode = \'[update\' . $shortcode_end[0] . \'[/update]\';

    //render the update shortcode
    $update = do_shortcode($shortcode);

    //remove the shortcode from te content
    $content = str_replace($shortcode, "", $content);

    //then return the update before the content
    return $update.$content;

}

结束