Список боковых панелей на странице


Мне нужно сгенерировать список боковых панелей на данной странице. Я знаю, как перечислить все зарегистрированные боковые панели и все зарегистрированные боковые панели с активными виджетами, но я не знаю , как отфильтровать их до боковых панелей, которые отображались на отдельной странице с использованием 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();
Author: kaiser, 2014-03-25

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() так как именно здесь вы уже получили название и знаете, есть ли виджеты или нет.

 3
Author: kaiser, 2014-03-25 21:00:17