Доступны ли виджеты WordPress (или боковой панели)?

Я пытаюсь отфильтровать весь вывод виджета через простой фильтр, но не могу найти никаких крючков и надеялся быть направленным в правильном направлении. Или, возможно, мои усилия даже не возможны?

Мой простой фильтр выглядит примерно так:

function clean_widget_output( $input ) {
    return str_replace( array( "\t", "\n", "\r" ), '', $input );
}

add_[FILTER OR ACTION]( 'need_a_hook', 'clean_widget_output', 99 );

Любые идеи? Я новичок в PHP, но я могу обойти.

Ответы

Ответ 1

Это было обусловлено необходимостью/желанием очистить ужасный HTML-код, изверженный виджетами WordPress. Мне нравится то, что они делают, но некоторые из результатов заставляют меня плакать.

Короткий ответ output buffering, потому что я не мог найти никаких виджета или перехватчиков боковой панели.

Долгий ответ:

function tidy_sidebar( $sidebar_name_or_id )
{
    ob_start();

    $bool = dynamic_sidebar( $sidebar_name_or_id);

    if ( $bool )
    {
        $str = ob_get_contents();
        $str = 'do cleanup stuff...';
    }
    else
    {
        $str = '';
    }
    ob_end_clean();

    return $str;
}

Затем вызовите echo tidy_sidebar( 'sidebar-name-or-id' ); из своей темы.

Ответ 2

У меня была аналогичная проблема, и, просмотрев список всех перехватов фильтров WordPress от Адама Брауна , выяснилось, что необходимый мне крючок существует ( widget_title, как упоминает pxl), но что нет никакого крючка, чтобы получить весь вывод виджета. Я думал, что я подробно остановимся на решении, которое сработало для меня.

Теоретически, крюк widget_title должен влиять на все виджеты в вашем блоге, но я уверен, что некоторые сторонние виджеты пренебрегают включением необходимой строки кода для применения каких-либо фильтров заголовков, чтобы он не был надежным. Тем не менее, это сработало для меня, и его можно использовать для применения специального "короткого кода" (точнее, в данном случае, "длинного кода" ) или синтаксиса к вашим названиям виджетов. Например, я хотел иногда включать html-код в мои заголовки виджетов, но по умолчанию все html удаляются. Итак, чтобы добавлять теги типа <em> к текстам в некоторых моих заголовках, я выбрал специальный синтаксис: [[ вместо < и ]] вместо > (например, [[em]] и [[/em]]), а затем создала функцию в моем файле functions.php темы для обработки этого настраиваемого синтаксиса и заменила его эквивалентом html:

function parse_html_widget_title( $text ) {
    return str_replace(array('[[', ']]'), array('<', '>'), $text);
}

Затем я добавил строку под ним, чтобы добавить функцию в качестве фильтра:

add_filter('widget_title', 'parse_html_widget_title', 11); // 11 is one above the default priority of 10, meaning it will occur after any other default widget_title filters

Функциональность add_filter/apply_filter автоматически передает фильтруемое содержимое в качестве первого параметра функции, указанной в качестве фильтра, так что все, что вам нужно сделать.

Чтобы сделать что-то похожее для основного вывода виджета, вам нужно будет посмотреть на все ваши виджеты, чтобы увидеть, какой крюк они используют, и убедиться, что у них есть фильтр для их основного вывода, чем использовать add_filter() для каждый найденный вами крючок с вашей пользовательской функцией обратного вызова (например, он widget_text для вывода текстового виджета или get_search_form для формы поиска [вы можете увидеть его в wp-includes/general-template.php в get_search_form() function]). Проблема в том, что некоторые динамически созданные виджеты не имеют крючков (например, виджет Meta), поэтому решение для буферизации вывода Jeff является самым универсальным, хотя и не идеальным решением.

Ответ 3

есть много крючков для виджетов Wordpress, которые не документированы. Wordpress codex не перечисляет их, по какой бы причине (например, эти крючки могут измениться в будущем и неожиданно прервется новыми обновлениями и версиями)... поэтому используйте их с особой осторожностью.

чтобы узнать, что они собой представляют, есть как минимум 2 места:

<wordpress install directory>/wp-includes/default-filters.php
<wordpress install directory>/wp-includes/default-widgets.php

содержащийся в этих двух файлах, является довольно хорошим списком всех используемых в Wordpress приложений.

Примером может служить фильтр для виджетов: widget_title

используйте их с осторожностью, они не гарантируют работу за определенной версией кода, который вы ищете.

Ответ 4

Я не уверен, когда они представили фильтр widget_text, возможно, они не имели его в '09, когда этот вопрос изначально был задан, но так как он есть сейчас, и для всех, кто получает этот stackoverflow, как я сделал из Google, и просто случается, чтобы прочитать достаточно далеко, чтобы увидеть этот ответ, теперь это довольно просто:

function my_widget_filter( $content )
{
    // manipulate $content as you see fit
    return $content;
}

add_filter( 'widget_text', 'my_widget_filter', 99 );