WPBakery页面生成器未在WooCommerce产品类别页面上呈现短代码

时间:2018-11-07 02:44:16

标签: php wordpress woocommerce themes

我正在开发一个非常复杂的主题,其中我为“标题”和“页脚”创建了自定义帖子类型,并为此启用了WPBakery Page Builder(当前在Wordpress 4.9.8中使用v5.5.5)。

在header.php中,将Header帖子拉入并呈现在

标记内,然后在footer.php中将Footer帖子拉入并呈现在
标记内。

除了进入WooCommerce中的产品类别页面时,所有内容都可以完美地工作,然后页眉和页脚仅显示为页面构建器的原始短代码,而不解析它们。 WooCommerce的其他一切都很好;商店页面,单个产品页面,购物车,结帐都很好。出于某种原因,这只是类别。

这是header.php中的代码:

<?php

$this_page_id = get_queried_object_id();

$gd_page_header = get_post_meta( $this_page_id, 'gd_page_header' );
if(empty($gd_page_header) || count($gd_page_header) == 0 || $gd_page_header[0] == 'default'){
    $header_id = intval(get_option('default_header'));
}else{
    $header_id = $gd_page_header[0];
}
if(!empty($header_id) && $header_id != '' && $header_id != 'none'){
    $post   = get_post( $header_id );
    $transparent_header = get_post_meta( $post->ID, 'transparent_header', true );
    $sticky_header = get_post_meta( $post->ID, 'sticky_header', true );
    $sticky_desktop_only = get_post_meta( $post->ID, 'sticky_desktop_only', true );
    if($sticky_header == '1'){
        $header_class = 'sticky';
        if($sticky_desktop_only == '1'){
            $header_class .= ' dt_only';
        }
    }elseif($transparent_header == '1'){
        $header_class = 'transparent';
    }else{
        $header_class = '';
    }
    $content = $post->post_content;
    $content_css = visual_composer()->parseShortcodesCustomCss( $content );
    if ( ! empty( $content_css ) ) { ?>
         <style type="text/css" data-type="vc_shortcodes-custom-css">
                     <?php echo strip_tags( $content_css ); ?>
         </style>
    <?php } ?>

    <header class="<?php echo($header_class); ?>">
        <div id="container" class="container clearfix">
            <?php echo apply_filters( 'the_content', $content ); ?>
        </div>
    </header>
<?php } ?>

然后这是page.php中的代码,WooCommerce将其内容提取到其中:

<?php get_header(); ?>
    <?php if (have_posts()) : while (have_posts()) : the_post(); ?>
        <main id="post-<?php the_ID(); ?>">
            <div id="container" class="container clearfix">
                <?php the_content(); ?>
            </div>
        </main>
    <?php endwhile; endif; ?>
<?php get_footer(); ?>

这是我的测试站点的主页:http://sandbox.graphicdetail.co.nz/

如您所见,所有内容在那里都能很好地显示。 一切也都在“商店”页面上很好地显示:http://sandbox.graphicdetail.co.nz/shop/

但是,当我们进入类别页面时,一切都崩溃了:http://sandbox.graphicdetail.co.nz/product-category/toys/

我知道WPBakery页面生成器在此页面上仍然处于活动状态,因为您可以在header.php代码中看到它所在的位置:

$content_css = visual_composer()->parseShortcodesCustomCss( $content );
if ( ! empty( $content_css ) ) { ?>
     <style type="text/css" data-type="vc_shortcodes-custom-css">
                 <?php echo strip_tags( $content_css ); ?>
     </style>
<?php } ?>

...看起来确实不错,因为当我用检查器查看页面时,我可以看到CSS正确填充。

希望这里的某人可能对我去哪里很可怕,非常错误地有所了解?

2 个答案:

答案 0 :(得分:0)

为了让遇到此问题的其他人受益,我终于解决了这个难题,这要归功于本文(特别是“模板文件”部分):

http://stephanieleary.com/2010/02/using-shortcodes-everywhere/

所以我的header.php文件中包含以下代码:

<?php $content = $post->post_content; ?>

<header class="<?php echo($header_class); ?>">
    <div id="container" class="container clearfix">
        <?php echo apply_filters( 'the_content', $content ); ?>
    </div>
</header>

我可以确定所有内容均已正确提取,并且CSS已正确解析,依此类推,但这仅仅是出于某种原因未对WPBakery Page Builder的短代码进行解析。

因此,在阅读了斯蒂芬妮·李瑞(Stephanie Leary)的文章后,我决定尝试以下方法:

<?php
    $content = $post->post_content;
    $content = apply_filters( 'the_content', $content );
?>

<header class="<?php echo($header_class); ?>">
    <div id="container" class="container clearfix">
        <?php echo do_shortcode($content); ?>
    </div>
</header>

因此,我不只是尝试回显apply_filters,还用$ apply_filters填充了$ content变量,然后将$ content解析为简码和whalah!奏效了!

答案 1 :(得分:0)

在回显内容之前使用它:

WPBMap::addAllMappedShortcodes();
echo apply_filters('the_content', the_content());