首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >dynamic_sidebar()停止工作

dynamic_sidebar()停止工作
EN

WordPress Development用户
提问于 2019-07-06 19:24:09
回答 2查看 1K关注 0票数 0

自定义页面模板已经使用了3或4年,它提供了一个自定义侧边栏,但它突然停止了呈现。我一辈子都找不出问题出在哪里。

代码语言:javascript
复制
/* functions.php */

/**
 * Register Areas sidebars and widgetized areas.
 *
 */
function my_widgets_init() {

    register_sidebar( array(
        'name'          => 'My Sidebar',
        'id'            => 'my_sidebar',
        'before_widget' => '',
        'after_widget'  => ' ',
        'before_title'  => '',
        'after_title'   => '',
    ) );

}
add_action( 'widgets_init', 'my_widgets_init' );

/* wordpress page template file*/

在Wordpress仪表板中,按预期将3或4个小部件分配给该区域。但是,调用dynamic_sidebar()会呈现一个空字符串。

有什么想法吗?

*更新*

这是第一个响应中提供的调试代码的输出。

代码语言:javascript
复制
Sidebar ID: new_sidebar ( Active)
Sidebar Found
4 Widgets Found

All Sidebars Widgets:
Array
(
    [wp_inactive_widgets] => Array
        (
            [0] => calendar-4
            [1] => rss-3
            [2] => em_calendar-4
            [3] => recent-posts-2
        )

    [hca_alert_area] => Array
        (
        )

  [SNIP - other sidebars]

    [new_sidebar] => Array
        (
            [0] => search-2
            [1] => nav_menu-2
            [2] => em_widget-2
            [3] => recent-posts-3
        )

    [footer-sidebar] => Array
        (
            [0] => nav_menu-3
        )

    [array_version] => 3
)

我花了大量的时间来解决这个问题。该网站使用不再支持樱桃框架模板的版本。我不愿意更新整个主题纯粹是因为这个小故障,如果我能修复它。

EN

回答 2

WordPress Development用户

回答已采纳

发布于 2019-07-07 04:04:32

在这种情况下,您可能需要检查dynamic_sidebar中的条件,以找出什么是没有发生的。

代码语言:javascript
复制
if (isset($_GET['debugsidebar'])) {add_action('init', 'debug_sidebar');}  
function debug_sidebar() {

    $id = $_GET['debugsidebar'];
    $sidebarswidgets = get_option('sidebars_widgets');

    if (is_active_sidebar($id)) {$status = " Active";} else {$status = "Inactive";}
    echo "Sidebar ID: ".$id." (".$status.")
";
    if (array_key_exists($id, $sidebarswidgets)) {
        $found = "Sidebar Found";
        if (is_array($sidebarswidgets[$id])) {
            $widgets = count($sidebarswidgets[$id])." Widgets Found";
        } else {$widgets = "Widget Array not Found!";}
        echo $found."";
    else {echo "Sidebar Not Found
";}

    echo "
All Sidebars Widgets: ".print_r($sidebarswidgets,true)."
"; 
    exit;
}

将其放入主题functions.php,然后通过http://example.com/?debugsidebar=my_sidebar进行检查。

在错误检查中有一个小的区别是is_active_sidebardynamic_sidebar

来自is_active_sidebar函数:

代码语言:javascript
复制
! empty( $sidebars_widgets[ $index ] );

来自dynamic_sidebar函数:

代码语言:javascript
复制
if ( empty( $wp_registered_sidebars[ $index ] ) || empty( $sidebars_widgets[ $index ] ) || ! is_array( $sidebars_widgets[ $index ] ) ) {

由于中间条件相同,这意味着侧边栏没有正确注册(不太可能,因为这似乎很好)-但更有可能的是,该键的数据不是一个小部件数组。您将从运行调试函数中找到答案。

它可能会在sidebars_widgets选项值中显示不匹配或损坏的数据(如果需要,可以对照wp_options表备份时的值进行检查)。

票数 1
EN

WordPress Development用户

发布于 2019-08-13 14:28:19

过时的Cherry插件( 9.2.8.1版本,理论上不支持PHP )中的下列行导致边栏一直被隐藏。

In文件wordpress/wp-content/plugins/cherry-plugin/includes/widgets/widgets-manager.php

Comment输出以下代码:

代码语言:javascript
复制
add_filter( 'widget_display_callback', 'maybe_hide_widget', 10, 3 );
function maybe_hide_widget( $instance, $widget_object, $args ) {
if ( ! check_widget_visibility( $args['widget_id'] ) )
    return false;
    return $instance;
}

还可以在同一个文件中编辑check_widget_visibility()函数(很明显),这样它就不会总是返回false并继续按预期工作。然而,就我的目的而言,简单地禁用整个机制就足够了。

票数 0
EN
页面原文内容由WordPress Development提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://wordpress.stackexchange.com/questions/342315

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档