Список боковых панелей на странице
Мне нужно сгенерировать список боковых панелей на данной странице. Я знаю, как перечислить все зарегистрированные боковые панели и все зарегистрированные боковые панели с активными виджетами, но я не знаю , как отфильтровать их до боковых панелей, которые отображались на отдельной странице с использованием PHP.
Чтобы попытаться обойти это, я взял $wp_registered_sidebars
и заменил его классом, который реализовал ArrayAccess
, что на 90% соответствует тому, что он перехватывает вызовы и сохраняет запрошенные боковые панели, только боковые панели никогда не отображаются, потому что где-то is_array
или другая проверка не выполняется.
Я также могу перехватить dynamic_sidebar_params
и проверить поле идентификатора в первом элементе массива, но это говорит мне только о том, какие динамические боковые панели вызываются активными виджетами, но не говорит мне, когда используется пустая боковая панель.
Вот мой класс перехвата:
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 answers
На самом деле есть фильтры, поставляемые с 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 );
2-й аргумент указывает, есть ли на боковой панели виджеты.
Текущий обходной путь: Подключитесь к sanitize_title()
, так как это удержит текущую боковую панель name/ID
. Затем подключитесь к wp_get_sidebars_widgets()
так как именно здесь вы уже получили название и знаете, есть ли виджеты или нет.