我需要在给定页面上生成边栏列表。我知道如何列出所有已注册的侧栏,以及所有已注册的具有活动小部件的侧栏,但我不知道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();