帖子内容中包含的快捷代码可以向<head>添加样式吗?

时间:2011-09-05 作者:yakatz

我有一个快捷码,它遍历自定义帖子类型的列表,并在显示它们时创建一个块。在HTML5中,在标题外有样式块是非法的(可能在其他版本中也是如此,但我们使用的是HTML5)。

我正在寻找一种方法,使我的短代码可以将其块插入头部。有什么建议吗?

这是页面:http://2011.solarteam.org/sponsors/gift-recognition/view-of-living-room

在一个页面上调用两次短代码<像这样一次[interactive slug=\'sponsor-map-living-room\' show="image"]Select an item to learn more about its sponsor.[/interactive] 制作图像<像这样一次[interactive slug=\'sponsor-map-living-room\' show=\'list\' headertitle=\'WaterShed Featured Sponsors: Living Room\' /] 将列表列在底部。

我无法将其放入模板中,因为模板不知道是哪个slug 转到哪一页。

以下是简化版的短代码处理代码:

<ul><?
foreach($map->points as $point){
    $result = "";
    if(!in_array($point->pointer_type, $all_styles[\'regular\'])){
        $all_styles[\'regular\'][$point->pointer_type] = "
            .pointer_style_" . $point->pointer_type . " {
                width: " . $point->pointer_width(). "px;
                height: " . $point->pointer_height(). "px;
                background: transparent url(\'/images/interactive/pointers/" . $point->pointer_URL() . "\');
            }
        ";
    }
    ob_start(); ?>
    <li class="tag_point sponsor_data_point pointer_style_<?php echo $point->pointer_type?>" id="point_<?php echo $point->ID ?>" data-in="#point_<?php echo $point->ID ?>_info" data-hover-style="pointer_s_style_<?php echo $point->selected_pointer_type?>" style="left:<?php echo $point->x - ($point->pointer_width()/2) ?>px;top:<?php echo $point->y - ($point->pointer_height()/2)?>px;">
    <div class="tag_info" id="point_<?php echo $point->ID ?>_info">
        <div class="donation-title"><?php echo $point->contribution ?></div>
        <div class="donation-contribution"><?php echo $point->description ?></div>
    </div>
    <?
    $result .= ob_get_clean();
    $result .= "</li>\\n";
    echo $result;
}
?>
</ul>
<style type="text/css">
    <?php echo join("\\n", $all_styles[\'regular\']); ?> 
</style>
The<style> HTML5中不允许使用标记,所以我想把它放在页面的头部。

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

the_posts 并检查每个帖子,看看你的短代码是否存在,你可以使用wp_enqueue_style 如果是的话。也许用一点正则表达式来检查是否存在短代码才是最好的方法,不幸的是我对正则表达式不是很好!

function wpse27772_has_shortcode($posts) {
    if ( empty($posts) )
        return $posts;

    $has_shortcode = false;

    foreach ($posts as $post) {
        //check for your shortcode in $post->post_content
        //set $has_shortcode = true if it\'s found
    }

    if($has_shortcode === true):
        wp_enqueue_style( \'mystyle\', get_template_directory_uri().\'/mystyle.css\' );
    endif;

    return $posts;
}
add_action(\'the_posts\', \'wpse27772_has_shortcode\');
编辑-下面我的评论中的快速示例。。。

function wpse27772_output_styles(){
    global $posts;
    foreach ($posts as $post) {
        // inspect $post->post_content;
        // echo "<style type=\'text/css\'></style>";  
    }
}
add_action(\'wp_head\', \'wpse27772_output_styles\');

SO网友:Moshe Katz

我碰巧更了解这个项目的要求,所以这里是我的建议。

有一大堆元素都需要以下样式:-背景-大小-颜色-悬停行为-位置

所有这些元素(位置除外)都可以保存在单独的样式表中,因为它们对于所有元素都是相同的。

带有此短标签的页面也都使用特定的模板。您可以使用wp_enqueue_style 仅在这些页面上包含CSS文件。

例如,对于由于来自数据库而不能在单独文件中的少量样式(位置),它们可以是内联的<div style"..."></div>.

SO网友:Jeremy Jared

你不能把你的短代码保存为文件吗?

Example: 打开一个空白文本文档,并将您的短代码粘贴到其中。接下来将其另存为my\\u shortcode。php。将其上载到主题根目录,然后使用

<?php get_template_part(\'my_shortcode\'); ?>
通过将其放置在结束标头标记之前,应该可以正常工作。我从来没有试过,所以我不确定,但值得一试。

SO网友:Dominic P

我意识到这是一个老问题,但我最近需要这样做。我的解决办法是wp_head 并在帖子内容中运行任何短代码。这很有效,因为我处理通话的短码wp_enqueue_scriptwp_enqueue_style 当它们被处理时。

代码如下所示:

function  example_shortcodes() {
    global $posts;

    foreach ( $posts as $my_post ) {

        ob_start(); // just in case
        do_shortcode( $my_post->post_content );
        ob_end_clean();
    }
}
add_action( \'wp_head\', \'example_shortcodes\', 5 );
性能是一个问题,因为这意味着您要运行两次短代码,如果一个短代码在运行时“做”了什么,可能会产生意外的副作用。有鉴于此,只处理您知道不会成为此技术问题的特定短代码可能是明智的。

结束

相关推荐

流视频播放器不能使用DO_SHORTCODE()?

我下载了一个名为Stream Video Player, 它有一个短代码。如果我把这个短代码放在内容编辑器中,它会很好地工作,并显示视频。但是,如果在我创建的模板中,我通过do_shortcode() 函数,它不起作用,它只显示文本[stream bla bla]. 谁能帮帮我,告诉我为什么会这样?