Split Content and Gallery

时间:2013-11-06 作者:Howdy_McGee

有没有办法将帖子内容和库短代码分开。我想在我的正常内容之外显示库,无论其放置方式或位置如何。我可以用它来获取短代码本身:

if(has_shortcode(get_the_content(), \'gallery\')){
    $pattern = get_shortcode_regex(); 
    preg_match("/$pattern/s", get_the_content(), $matches);
    echo do_shortcode($matches[0]);
}
但如果gallery短代码不是第一个实例,那么这就不起作用。有没有办法将我的内容和库完全拆分?

<小时>Edit: 我有一个半解决方案,但这似乎是一个冗长的方法。它首先获取帖子中的第一个短代码(需要修复,因为我只需要“Gallery”短代码),然后从内容中删除所有短代码(同样,这不是我真正想要做的)。

<?php if(has_shortcode(get_the_content(), \'gallery\')) : ?>
    <?php 
        $pattern = get_shortcode_regex(); 
        preg_match("/$pattern/s", get_the_content(), $matches);
    ?>
    <div id="content">
        <?php echo strip_shortcodes(get_the_content()); ?>
    </div>
    <div id="gallery">
        <?php echo do_shortcode($matches[0]); ?>
    </div>
<?php endif; ?>
<小时>Edit #2 - 好的,我只能在帖子中找到画廊的短代码。我还添加了一个过滤器来删除gallery短代码表单the_content() - 问题是它不一定要删除短代码,因为它确实会发布它,但它不允许我运行“do\\u shortcode()”

Functions.php

function remove_gallery($content) {
    global $post;

    if($post->post_type == \'artcpt\')
        remove_shortcode(\'gallery\', $content);

    return $content;
}
add_filter( \'the_content\', \'remove_gallery\', 6); 

The Loop

<?php preg_match(\'/\\[gallery ids=[^\\]]+\\]/\', get_the_content(), $matches); ?>
<div id="content">
    <?php the_content(); ?>
</div>
<div id="gallery">
    <?php echo do_shortcode($matches[0]); ?>
</div>
在循环中,它将返回我的短代码Twice (我在一个页面上,应该循环两次-因此它没有运行do\\u shortcode())。不知道为什么。

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

任何人都可以简化这一点,但以下是我想到的对我有用的方法。

第一件事是第一件事-使用get_post_gallery(), 循环一开始:

<?php if( have_posts() ) : ?>

    <?php while( have_posts() ) :
            the_post();
            $gallery = get_post_gallery();
            $content = strip_shortcode_gallery( get_the_content() );
    ?>

        <div id="content">
            <?php echo $content; ?>
        </div> <!-- id="content" -->

        <div id="gallery">
            <?php echo $gallery; ?>
        </div> <!-- id="gallery" -->

    <?php endwhile; ?>

<?php endif; ?>
strip_shortcode_gallery() 功能-功能。php

function strip_shortcode_gallery( $content ) {
    preg_match_all( \'/\' . get_shortcode_regex() . \'/s\', $content, $matches, PREG_SET_ORDER );

    if ( ! empty( $matches ) ) {
        foreach ( $matches as $shortcode ) {
            if ( \'gallery\' === $shortcode[2] ) {
                $pos = strpos( $content, $shortcode[0] );
                if( false !== $pos ) {
                    return substr_replace( $content, \'\', $pos, strlen( $shortcode[0] ) );
                }
            }
        }
    }

    return $content;
}

Resources:

堆栈溢出:

我最初想要做的事情并没有如预期的那样奏效:

SO网友:kaiser

核心短码正则表达式基本上我们可以使用正则表达式来实现这一点,实际上,即使使用Core提供的正则表达式get_shortcode_regex().

首先,我们需要获取shortcode标记并构建一个regex。核心功能get_shortcode_regex() 遗憾的是,我们没有机会加入争论,所以我们只剩下一个匹配每个短码的正则表达式,这是不受欢迎的,因为我们只想针对[gallery] 短代码。

// Get all tags as Array
$tags = $GLOBALS[\'shortcode_tags\'];
// remove the gallery-shortcode; \'gallery\' is the key
unset( $tags[\'gallery\'] );
// retrieve all shortcodes (but not \'gallery\') separated by a vertical pipe char/the "or" Regex char
$tags = join( \'|\', array_map(
    \'preg_quote\',
    array_keys( $GLOBALS[\'shortcode_tags\'] )
) );
接下来,我们需要一个能够捕获所有库的正则表达式。所以我们打电话来preg_match_all() 因为它将以数组形式返回库短代码的所有匹配项,其中0 索引(其余部分将是部分匹配,可以忽略)。

$pattern = get_shortcode_regex();
preg_match_all( "/$pattern/s", get_the_content(), $galleries );
现在$galleries[0] 保存库快捷码标记数组。

没有图库的内容

接下来我们需要做的是删除所有[gallery] 内容中的短代码。我们将再次使用相同的正则表达式并在上运行它get_the_content(). 当然,我们应用the_content 可以在渲染时通过回调添加过滤器作为短代码。

$content = preg_replace_callback(
    "/$pattern/s",
    \'strip_shortcode_tag\',
    apply_filters( \'the_content\', get_the_content() )
);
The$content 变量现在保存我们的内容。

更改内容的回调示例或:如何将内容拆分为图库和帖子的其余部分我们可以在回调过程中轻松地用新内容替换内容:

$tags = $GLOBALS[\'shortcode_tags\'];
unset( $tags[\'gallery\'] );

$tags = join( \'|\', array_map(
    \'preg_quote\',
    array_keys( $GLOBALS[\'shortcode_tags\'] )
) );
$pattern = get_shortcode_regex();

preg_match_all( "/{$pattern}/s", get_the_content(), $galleries );

echo $galleries;
echo "<hr>";
echo preg_replace_callback(
    "/{$pattern}/s",
    \'strip_shortcode_tag\',
    apply_filters( \'the_content\', get_the_content() )
);
这将首先添加所有图库,然后添加没有图库的内容,两者都由水平规则分隔。这只是一个起点。

SO网友:bob-12345

它不应该如此复杂。下面的代码可以根据需要缩短为几行。

Approach 1. Get the clean post content by removing all shortcodes, including the gallery one from the post content.

注意:所有其他短代码将从帖子中删除。如果您没有在那里放置自定义短代码,那么这种方法适合您。

假设您在WP循环中

$ctt = apply_filters(\'the_content\',strip_shortcodes(get_the_content())); // This is your cleaned content
$glry = get_post_gallery(); // and here is the gallery.
假设你出去了

$my_postid = 12;
$my_post = get_post($my_postid);
$ctt = apply_filters(\'the_content\',strip_shortcodes($my_post->post_content));
$glry = get_post_gallery($my_postid);

Approach 2. Remove only [gallery] shortcode, keep all other shortcodes in.

依靠内部实现[gallery] shortcode看起来像,可由WP团队更改,因此可能不像第一种方法那样经得起未来的考验:

在WP回路中

$ctt = preg_replace(\'/\\[gallery.*\\]/\', \'\', get_the_content());
$ctt = apply_filters(\'the_content\',$ctt); // This is your cleaned content
$glry = get_post_gallery();
超出范围

$my_postid = 12;
$my_post = get_post($my_postid);
$ctt = apply_filters(\'the_content\',preg_replace(\'/\\[gallery.*\\]/\', \'\', $my_post->post_content));
$glry = get_post_gallery($my_postid);

结束

相关推荐

将一个PHP变量(loop-audio.php)传递给jQuery函数(js/script.js)

我已经为此搜索了很多次,似乎得到了不同的答案。在我的情况下,jQuery函数必须使用来自不同文件的PHP变量。我如何才能做到这一点?请给出清晰简单的答案。