WordPress自定义边栏,小部件显示在旁边标记

时间:2019-02-08 20:07:09

标签: php wordpress

我在wordpress中有一个自定义的侧边栏,这是sidebar.php中的工作代码:

if ( ! is_active_sidebar( 'sidebar-1' ) ) {
    return;
}
?>

<aside id="secondary" class="sidebar-area widget-area">
    <div class="sidebar-area-wrap">
        <?php dynamic_sidebar( 'sidebar-1' ); ?>
    </div>
</aside><!-- #secondary -->

我在functions.php(works)中添加了选项,所以现在的代码如下:

if ( ! is_active_sidebar( 'sidebar-1' ) ) {
    return;
}

$swag_sidebar_location = get_theme_mod('swag_sidebar_location');
if (isset($swag_sidebar_location) && $swag_sidebar_location=='') {
$swag_sidebar_location ='sidebar-location-none';
}

?>

<?php

if (isset($swag_sidebar_location) && $swag_sidebar_location=='sidebar-location-right' || $swag_sidebar_location=='sidebar-location-left') {
    echo '
        <aside id="secondary" class="sidebar-area widget-area">
            <div class="sidebar-area-wrap">
                ' . dynamic_sidebar( "sidebar-1" ) . '
            </div>
        </aside>
    ';
}

?>

问题在于窗口小部件出现在标签的外部和之前,数字“ 1”出现在标签内部。

我猜问题出在这里:' . dynamic_sidebar( "sidebar-1" ) . ' 我不知道php,只是想弄清楚。我该如何解决?

编辑:HTML如下所示的示例:

<section id="pages-2" class="widget">xxxxxx</section>
<section id="pages-2" class="widget">xxxxxx</section>
<section id="pages-2" class="widget">xxxxxx</section>
<section id="pages-2" class="widget">xxxxxx</section>
<aside id="secondary" class="sidebar-area widget-area sidebar-location-right">          <div class="sidebar-area-wrap">             1           </div>      </aside>

与其看起来像这样不正确:

<aside id="secondary" class="sidebar-area widget-area sidebar-location-right">           
    <div class="sidebar-area-wrap">
        <section id="pages-2" class="widget">xxxxxx</section>
        <section id="pages-2" class="widget">xxxxxx</section>
        <section id="pages-2" class="widget">xxxxxx</section>
        <section id="pages-2" class="widget">xxxxxx</section>
    </div>
</aside>

编辑:根据要求,我在functions.php中注册侧边栏代码

function swagger_widgets_init()
{
    register_sidebar(array(
        'name' => esc_html__('Sidebar', 'swagger'),
        'id' => 'sidebar-1',
        'description' => esc_html__('Add widgets here.', 'swagger'),
        'before_widget' => '<section id="%1$s" class="widget %2$s">',
        'after_widget' => '</section>',
        'before_title' => '<h2 class="widget-title"><span class="widget-title-span">',
        'after_title' => '</span></h2>'
    ));
}
add_action('widgets_init', 'swagger_widgets_init');

1 个答案:

答案 0 :(得分:3)

好的旧版Wordpress及其“回显功能”

dynamic_sidebar()不是return值; echo是一个。这使得它不适合在字符串中串联,因为在字符串评估期间,其结果将echo进行处理,甚至在创建字符串之前将其发送到输出缓冲区。

不幸的是,Wordpress没有提供此功能的get_*版本来返回字符串(但请参阅https://core.trac.wordpress.org/ticket/13169)。

执行三个单独的调用,而不是进行串联。例如...

echo '<aside id="secondary" class="sidebar-area widget-area"><div class="sidebar-area-wrap">';
dynamic_sidebar( "sidebar-1" );
echo '</div></aside>';

您也可以使用单个echo语句,但不要串联,而是将几个逗号分隔的参数传递给它,例如

echo '<aside id="secondary" class="sidebar-area widget-area"><div class="sidebar-area-wrap">',
        dynamic_sidebar( "sidebar-1" ),
        '</div></aside>';

另一种选择是坚持使用if条件包装的原始HTML和PHP混合格式。例如

if (isset($swag_sidebar_location) && $swag_sidebar_location=='sidebar-location-right' || $swag_sidebar_location=='sidebar-location-left') : ?>
<aside id="secondary" class="sidebar-area widget-area">
    <div class="sidebar-area-wrap">
        <?php dynamic_sidebar( 'sidebar-1' ) ?>
    </div>
</aside>
<?php endif ?>

请参见http://php.net/manual/control-structures.alternative-syntax.php