Dynamic_Sidear()停止工作

时间:2019-07-06 作者:fred2

一个已经使用了3到4年的自定义页面模板呈现了自定义侧栏,但它突然停止了呈现。我一生都搞不清楚问题出在哪里。

/* functions.php */

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

    register_sidebar( array(
        \'name\'          => \'My Sidebar\',
        \'id\'            => \'my_sidebar\',
        \'before_widget\' => \'<div>\',
        \'after_widget\'  => \'</div><div>&nbsp;</div>\',
        \'before_title\'  => \'<h2 class="rounded">\',
        \'after_title\'   => \'</h2>\',
    ) );

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

/* wordpress page template file*/
<?php if ( is_active_sidebar( \'my_sidebar\' ) ) : ?>
    <div>
        <?php dynamic_sidebar( \'my_sidebar\' ); ?>
    </div>
<?php endif; ?>
在Wordpress仪表板中,按预期为该区域分配了3或4个小部件。但是调用dynamic\\u sidebar()会呈现一个空字符串。

有什么想法吗?

* UPDATE *

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

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
)
我花了大量时间试图解决这个问题。该站点使用不再受支持的Cherry框架模板版本。如果我能解决这个问题,我不愿意仅仅因为这个问题而更新整个主题。

2 个回复
最合适的回答,由SO网友:majick 整理而成

在这种情况下,您可能需要检查dynamic_sidebar 找出没有发生的事情。

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.")<br>";
    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."<br".$widgets."<br>";
    else {echo "Sidebar Not Found<br>";}

    echo "<br>All Sidebars Widgets: ".print_r($sidebarswidgets,true)."<br>"; 
    exit;
}
你把它放在你的主题里functions.php 然后可以通过http://example.com/?debugsidebar=my_sidebar

bugout检查有一点不同is_active_sidebardynamic_sidebar

从…起is_active_sidebar 功能:

! empty( $sidebars_widgets[ $index ] );
发件人dynamic_sidebar 功能:

if ( empty( $wp_registered_sidebars[ $index ] ) || empty( $sidebars_widgets[ $index ] ) || ! is_array( $sidebars_widgets[ $index ] ) ) {
由于中间条件是相同的,这意味着侧栏没有正确注册(不太可能,因为这看起来很好),但更有可能的是,该键的数据不是一个小部件数组。您将通过运行debug函数了解到这一点。

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

SO网友:fred2

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

In file: wordpress/wp-content/plugins/cherry-plugin/includes/widgets/widgets-manager.php

Comment out the following code:

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,并继续按预期运行。然而,就我而言,简单地禁用整个机制就足够了。