动态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\' );
最合适的回答,由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();
}