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())。不知道为什么。
#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);
评论
您是否考虑过仅为图库添加单独的所见即所得元框?然后,您总是可以在the_content()之后调用它。但是,如果已经有很多这样的页面,则比较棘手。我同意这是有可能的,但是我试图避免需要另一位大编辑-试图使其尽可能简单和直接。我希望我可以(当然没有插件)仅具有一个添加画廊metabox或类似的东西。
为什么不使用“使用preg_replace”将画廊与the_content分开的解决方案?