Как выводить подпись шорткода где-то кроме the_content
Я хочу отключить вывод подписей шорткодов для записей в одной из моих тем и выводить этот контент в другом месте, например, в сайдбаре.
Изображения не загружены в WordPress, а подключены через функционал редактора "Добавить изображение" → "Из URL", что приводит к следующему шорткоду:
[caption id="" align="alignnone" width="300" caption="Леонард Нимой сделал гораздо больше, чем просто сыграл мистера Спока"]<a href="http://example.com/nimoy"><img src="http://example.com/uploads/nimoy.jpg" alt="Леонард Нимой в черном костюме" title="Леонард Нимой" width="300" height="228" /></a>[/caption]
Какие есть идеи? Я предполагаю, что нужно использовать фильтр img_caption_shortcode
, но не уверен, правильный ли это подход.

Попробуйте это:
$caption_info = array();
add_filter( 'img_caption_shortcode', 'capture_caption', 10, 3 );
function capture_caption( $blank = '', $attr, $content ) {
global $caption_info;
$caption_info[] = array('attr' => $attr, 'content' => $content );
return ' ';
}
Это сохранит информацию из всех подписей в глобальную переменную $caption_info
и подавит их отображение в контенте (возвращается пробел, потому что результат фильтра игнорируется, если он пуст).

Отлично. Я знал, что это как-то сработает. Добавить ли условие is_singular()
к этому?

Ну, это зависит от того, как именно вы хотите, чтобы это работало. В этой форме оно будет срабатывать при каждом вызове функции img_caption_shortcode()
, которая обрабатывает шорткоды [caption]
и [wp_caption]
. Если вы хотите пропустить при некоторых условиях - проверяйте их и возвращайте пустую строку ''
в функции.

Я добавил это, но выполнение global $caption_info; var_dump($caption_info);
в моем single.php выводит array(0) {}
. Идеи?

Глупый момент, но я сам на это напоролся, так что... Переменная заполняется только после отображения контента и выполнения шорткодов. Вы делаете это после the_content()
?

Я только что сам это понял и уже собирался задать этот вопрос, лол. Помогает сделать так: $content = apply_filters('the_content',get_the_content());
раньше на странице. Затем я могу просто сделать echo $content
там, где должен быть the_content()
. Но это всё равно кажется костылём. Есть ли способ запустить этот фильтр раньше?

Вероятно, есть несколько способов решить эту проблему. Я бы попробовал получить контент (без присваивания переменной) и удалить фильтр из img_caption_shortcode
, чтобы он больше не выполнялся и не дублировал информацию при фактическом отображении контента. Также можно просто получить контент и искать шорткоды с помощью regex, но это будет совершенно другой подход.
