动态Html不在各自的位置显示

时间:2019-11-01 作者:Naren Verma

动态HTML未在相应位置显示我在中创建了一个短代码function.php 我的代码是,

function Post_home(){
$data=\'<div class="cp-seeWrapper"><div class="container"><div class="row"><div class="col-xl-8 col-lg-8 col-md-8 col-sm-12 col-xs-12">\';

  //some logic here

  $data.=\'</div>\';
  $data.=\'<div class="col-xl-4 col-lg-4 col-md-4 col-sm-12 col-xs-12"><div class="cp-social">\';
            if (is_active_sidebar(\'footer-social\')) :
                 dynamic_sidebar(\'footer-social\');
                endif;
  $data.=\'</div><div class="cp-newsletter">\';
           if (is_active_sidebar(\'cp_newsletter\')) :
                 dynamic_sidebar(\'cp_newsletter\');
                endif;
  $data.=\'</div></div></div></div></div>\';
 return $data;    
}
add_shortcode( \'home_post\', \'Post_home\' );
现在请注意,无论我在父div之前添加输出显示的逻辑部分是什么cp-seeWrapper 并在其前面显示输出。

我添加了页脚社交和新闻稿逻辑,两者都显示在父div上方。

你能帮帮我吗?

My output is

//I am getting my output here
    <div class="cp-seeWrapper">
      <div class="container">
        <div class="row">
          <div class="col-xl-8 col-lg-8 col-md-8 col-sm-12 col-xs-12">
          </div>
          <div class="col-xl-4 col-lg-4 col-md-4 col-sm-12 col-xs-12">
            <div class="cp-social"></div>
            <div class="cp-newsletter"></div>
          </div>
        </div>
      </div>
    </div>

I have created widget on function.php

function cp_newsletters() {
    register_sidebar( array(
        \'name\'          => \'Newsletter\',
        \'id\'            => \'cp_newsletter\',
        \'before_widget\' => \'<div class="chw-newsletter">\',
        \'after_widget\'  => \'</div>\',
        \'before_title\'  => \'<h2 class="chw-newsletter_title">\',
        \'after_title\'   => \'</h2>\',
    ) );

}
add_action( \'widgets_init\', \'cp_newsletters\' );

1 个回复
最合适的回答,由SO网友:Sally CJ 整理而成

你得到的结果是因为dynamic_sidebar() 显示/回显输出(特定侧栏中的小部件),因此在调用shortcode函数时,输出会在$data 实际上是回声。

您可以使用output buffering:

将输出附加到$data:

$data.=\'</div>\';
$data.=\'<div class="col-xl-4 col-lg-4 col-md-4 col-sm-12 col-xs-12"><div class="cp-social">\';
if (is_active_sidebar(\'footer-social\')) :
    ob_start();
    dynamic_sidebar(\'footer-social\'); // echoes the widgets
    $data .= ob_get_clean();          // append the output
endif;
$data.=\'</div><div class="cp-newsletter">\';
if (is_active_sidebar(\'cp_newsletter\')) :
    ob_start();
    dynamic_sidebar(\'cp_newsletter\'); // echoes the widgets
    $data .= ob_get_clean();          // append the output
endif;
$data.=\'</div></div></div></div></div>\';
您可以随时打开/关闭输出缓冲,并且应该使用cp_newsletter 侧栏。

Update: 不确定为什么此选项不适用于您,但更新的代码可能会有所帮助

或者(可能更简单),回显函数中的所有内容:

function Post_home() {
    ob_start();
    ?>
        <div class="cp-seeWrapper">
          <div class="container">
            <div class="row">
              <div class="col-xl-8 col-lg-8 col-md-8 col-sm-12 col-xs-12">
              </div>
              <div class="col-xl-4 col-lg-4 col-md-4 col-sm-12 col-xs-12">
                <div class="cp-social">
                  <?php if ( is_active_sidebar( \'social-footer\' ) ) dynamic_sidebar( \'social-footer\' ); ?>
                </div>
                <div class="cp-newsletter">
                  <?php if ( is_active_sidebar( \'cp_newsletter\' ) ) dynamic_sidebar( \'cp_newsletter\' ); ?>
                </div>
              </div>
            </div>
          </div>
        </div>
    <?php
    return ob_get_clean();
}

更新

对于选项#1,您可能需要考虑缓存其中一个小部件(即ob_get_clean() 调用)或您的短代码输出(即$data). 我建议出于性能原因,短代码可以在同一页上调用两次或更多次。

此外,如果要使用选项#2(echo everything),则可能需要考虑创建模板并执行以下操作:

function Post_home() {
    ob_start();
    locate_template( \'my-template.php\', true );
    return ob_get_clean();
}

相关推荐

Custom Post type shortcodes

我使用高级自定义字段在我的主题中创建自定义帖子类型(功能)。我想知道如何创建自定义帖子类型的短代码。因此,我只使用任何页面的自定义帖子类型的短代码来显示我在自定义帖子类型(功能)中添加的信息。