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

if(has_shortcode(get_the_content(), 'gallery')){
    $pattern = get_shortcode_regex(); 
    preg_match("/$pattern/s", get_the_content(), $matches);
    echo do_shortcode($matches[0]);
}


但是,如果画廊短代码不是第一个实例,则此方法不起作用。有没有办法完全拆分我的内容和画廊?


编辑:我有一个半解决方案,但似乎很难解决。它首先获取帖子中的第一个短代码(由于我只想要“图库”短代码,因此需要对其进行修复),然后从内容中删除所有短代码(同样,并不是我真正想做的。) >
<?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; ?>



编辑#2-好的,我只能在帖子中获取画廊简码,还添加了一个过滤器以删除画廊简码形式the_content()-问题在于它并不一定要删除短代码,因为它确实将其发布了,但是它不允许我运行“ do_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>


在Loop中,它将返回我的短代码两次(我在同一页上,应该循环两次-因此其没有运行do_shortcode())。不知道为什么。

评论

您是否考虑过仅为图库添加单独的所见即所得元框?然后,您总是可以在the_content()之后调用它。但是,如果已经有很多这样的页面,则比较棘手。

我同意这是有可能的,但是我试图避免需要另一位大编辑-试图使其尽可能简单和直接。我希望我可以(当然没有插件)仅具有一个添加画廊metabox或类似的东西。

为什么不使用“使用preg_replace”将画廊与the_content分开的解决方案?

#1 楼


向任何可以简化这一点的人开放,但这就是我想出的对我有用的东西。

首先是第一件事-循环开始后,立即使用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()函数-functions.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;
}
 


资源:

堆栈溢出:


Wordpress删除简码并保存以供其他使用

我本来打算做的事情没有无法按预期工作:


WordPress从内容中删除简码


评论


唯一的问题是,这还会删除所有内容样式,例如




– Al Rosado
20 Jan 5 '20 at 20:53


@AlRosado我不认为这可以,但是如果是这样,您可以通过echo apply_filters('the_content',$ content);运行它。

– Howdy_McGee♦
20年1月6日在5:27



#2 楼

核心简码正则表达式

基本上,我们可以使用Regex做到这一点-实际上,即使使用get_shortcode_regex()核心提供的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'] )
) );


捕获所有画廊

接下来,我们需要一个可捕获所有画廊的Regex。因此,我们正在调用preg_match_all(),因为它会以带有0索引的数组的形式返回画廊简码的所有匹配项(其余部分将是部分匹配项,可以忽略)。

$pattern = get_shortcode_regex();
preg_match_all( "/$pattern/s", get_the_content(), $galleries );


现在,$galleries[0]保存了一组画廊简码标签。

没有图库的内容

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

$content = preg_replace_callback(
    "/$pattern/s",
    'strip_shortcode_tag',
    apply_filters( 'the_content', get_the_content() )
);


$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() )
);


,这将首先添加所有图库,然后添加不包含画廊的我们的内容,两者均由水平规则分隔。这只是一个起点。

评论


使用与wordpress.stackexchange.com/questions/193511/…中不同的方法。当我尝试您的代码时,我得到php错误-您可以看看吗?

–像啤酒一样
2015年7月4日在16:02



哪个代码?有什么错误?请详细。这是发展,不是猜测游戏。

– kaiser
15年7月5日在10:22

链接>wordpress.stackexchange.com/questions/193511/…中的代码和详细信息

–像啤酒一样
15年7月6日在13:28

#3 楼

它不应该太复杂。可以将下面的代码缩短为几行。

方法1.通过从帖子内容中删除所有短代码(包括图库)来获得干净的帖子内容。

NB:所有其他短代码将从帖子中删除。如果您不在其中放置自定义的简码,那么该方法适合您。

假设您处于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);


方法2。仅删除[gallery]短代码,保留所有其他短代码。

取决于内部实现方式[gallery]短代码看起来很像,可以由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);