只返回帖子中的短代码?

时间:2011-06-09 09:37:21

标签: php wordpress

是否可以过滤掉帖子中的短代码,然后运行短代码?

我的页面如下:

[summary img="images/latest.jpg"]

This here is the summary

[/summary]

Lots of text here...

我只想在特定页面上显示短代码。

尝试使用正则表达式,但它们似乎不起作用:

$the_query = new WP_Query('category_name=projects&showposts=1');

    //loop
    while ( $the_query->have_posts() ) : $the_query->the_post();
        echo '<b>';
        the_title();
        echo '</b>';
        echo '<p>';

        $string = get_the_content();

        if (preg_match("[\\[[a-zA-Z]+\\][a-zA-Z ]*\\[\/[a-zA-Z]+\\]]", $string , $matches)) {
            echo "Match was found <br />";
            echo $matches[0];
        }

        echo '</p>';
    endwhile;

任何idéas?

编辑:

找到一个临时解决方案。

while ( $the_query->have_posts() ) : $the_query->the_post();

    $content = str_replace(strip_shortcodes(get_the_content()),"",get_the_content());               
    echo do_shortcode($content);

endwhile;

我看到wordpress有一个用于条带化短代码但不用于条带内容的功能。所以我从整个帖子中删除了剥离的内容字符串以获得短代码。唯一不好的是,短代码必须在帖子的开头。

5 个答案:

答案 0 :(得分:13)

更好的答案是:

$pattern = get_shortcode_regex();
preg_match('/'.$pattern.'/s', $post->post_content, $matches);
if (is_array($matches) && $matches[2] == 'the_shortcode_name') {
   $shortcode = $matches[0];
   echo do_shortcode($shortcode);
}

它将在帖子内容中搜索名为“the_shortcode_name”的短代码。如果找到它,它会将短代码存储在$ matches变量中。很容易从那里运行。

答案 1 :(得分:2)

我对这些答案有以下问题:

  1. 正则表达式模式不包含所有已注册的短代码标签
  2. 无法从帖子
  3. 获取所有短代码

    ..我的解决方案是:

    // Return all shortcodes from the post
    function _get_shortcodes( $the_content ) {
    
        $shortcode = "";
        $pattern = get_shortcode_regex();
        preg_match_all('/'.$pattern.'/uis', $the_content, $matches);
    
        for ( $i=0; $i < 40; $i++ ) {
    
            if ( isset( $matches[0][$i] ) ) {
               $shortcode .= $matches[0][$i];
            }
    
        }
    
        return $shortcode;
    
    }
    

    像这样使用它:

    <?php echo do_shortcode( _get_shortcodes( get_the_content() ) ) ?>
    

答案 2 :(得分:1)

搜索您的短信代码位置

示例:

[my_shortcode]
[my_shortcode_2]

[my_shortcode_2]
[my_shortcode]

<强>的functions.php

function get_shortcode($code,$content) {
    $pattern = get_shortcode_regex();
    preg_match_all('/'.$pattern.'/s',$content,$matches);
    if(is_array($matches) && isset($matches[2]) && in_array($code,$matches[2])) {
        $index = array_search($code,$matches[2]);
        $shortcode = $matches[0][$index];;
        return do_shortcode($shortcode);
    } else {
        return false;
    }
}

使用示例:

$content = $post->post_content;
$my_shortcode = get_shortcode('my_shortcode',$content);
$my_shortcode_2 = get_shortcode('my_shortcode_2',$content);
echo $my_shortcode;
if($my_shortcode){ // if shortcode#1 found so echo shortcode#2 after
   echo $my_shortcode_2;
}

答案 3 :(得分:0)

使用此正则表达式

preg_match('/\[summary[^\]]*](.*)\[\/summary[^\]]*]/uis', $string , $matches)

$ match [1]应该是你的文字

编辑以匹配任何标签组合 使用

/\[([^\]]+)\](.*?)\[\/\1\]/uis

但是如果你有嵌套标签,你可能需要递归地再次解析匹配。但是,如果它是一个wordpress自由文本,我认为你可能会得到一个简单的脚本可以处理的复杂案例

答案 4 :(得分:-1)

您可以使用get_shortcode_regex()函数来获取博客中所有已注册的镜头代码的正则表达式,将其应用于内容以获取该内容中找到的一系列短代码,然后调用相应的回调进行处理你想要的那个。

所以在某个循环中,它会是这样的:

$pattern = get_shortcode_regex();
$matches = array();
preg_match_all("/$pattern/s", get_the_content(), $matches);
var_dump($matches); //Nested array of matches
//Do the first shortcode
echo preg_replace_callback( "/$pattern/s", 'do_shortcode_tag', $matches[0][0] );

这将执行帖子中找到的第一个短代码,显然在练习中你要检查你是否有一个!