List sidebars on a page

时间:2014-03-25 作者:Tom J Nowell

我需要在给定页面上生成边栏列表。我知道如何列出所有已注册的侧栏,以及所有已注册的具有活动小部件的侧栏,但我不知道how to filter 他们一直到the sidebars that were displayed on an individual page 使用PHP。

为了避开这个我$wp_registered_sidebars 并将其替换为实现ArrayAccess, 其中90%的方式是拦截调用并存储请求的侧栏,只有侧栏永远不会显示,因为某个地方是is_array 或其他检查失败。

我也可以拦截dynamic_sidebar_params 并检查第一个数组项中的id字段,但这只告诉我哪些动态侧栏是用活动的小部件调用的,它不告诉我何时尝试使用空侧栏。

这是我的截取课程:

class sidebar_counter implements \\ArrayAccess {

    private $container;
    private $offsets = array();

    function __construct( $container ) {
        $this->container = $container;
    }

    public function addOffset( $offset ) {
        if ( !in_array( $offset, $this->offsets ) ) {
            $this->offsets[] = $offset;
        }
    }

    public function getOffsets() {
        return $this->offsets;
    }

    public function offsetExists( $offset ) {
        $this->addOffset( $offset );
        return isset($this->container[$offset]);
    }

    public function offsetGet( $offset ) {
        $this->addOffset( $offset );
        return isset($this->container[$offset]) ? $this->container[$offset] : null;
    }

    public function offsetSet( $offset, $value ) {
        if ( is_null( $offset ) ) {
            $this->container[] = $value;
        } else {
            $this->container[$offset] = $value;
            $this->addOffset( $offset );
        }
    }

    public function offsetUnset( $offset ) {
        if ( ( $key = array_search( $offset, $this->offsets ) ) !== false ) {
            unset( $this->offsets[$key] );
        }
        return isset($this->container[$offset]) ? $this->container[$offset] : null;
    }
}
其预期用途:

// early on:
global $wp_registered_sidebars;
$this->counter = new sidebar_counter( $wp_registered_sidebars );
$wp_registered_sidebars = $this->counter;
然后在页脚之后:

$sidebar_ids = $counter->getOffsets();

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

实际上是这样的are filters 随附WP 3.9+:

  • do_action( \'dynamic_sidebar_before\', $index, false );
  • do_action( \'dynamic_sidebar_after\', $index, false );
  • apply_filters( \'dynamic_sidebar_has_widgets\', false, $index );
第二个参数指示侧栏是否有小部件。

当前解决方法:挂钩到sanitize_title() 因为这将保留当前侧栏name/ID. 然后钩住wp_get_sidebars_widgets() 因为这是您已经知道名称并知道是否有小部件的地方。

结束

相关推荐

Sidebar.php中的类别特定月份列表

是什么让我暂时分心,如何输出特定类别的月份列表。我一直在寻找同样的问题和解决方案,到目前为止找不到任何幸运。。。无论如何,我的网站上有两个帖子类型的页面。一个是新闻页面(例如。http://example.com/news/) 另一个是博客页面(例如。http://example.com/blog/).我使用archive.php 显示我的新闻和博客页面,以及我要在其中输出包含帖子计数的月份列表sidebar.php.我可以使用wp_get_archives(\'cat=0\')然而,这样的输出2013/