Как я могу применить_фильтры к моей пользовательской функции, которая выполняется add_action? - PullRequest
0 голосов
/ 16 февраля 2019

У меня есть пользовательская функция в моей родительской теме, которая подключается к admin_head Wordpress, делая вещи с разрешенными доменами, которые я определяю в функции.Эта часть отлично работает.

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

Это демонстрирует проблему, которую я пытаюсь решить:

function custom_function( $additional_domains ) { 
    $allowed_domains = array(
        'domain1.com',
        'domain2.com',
        'domain3.com',
    );

    if ( $additional_domains ) {
        array_push( $allowed_domains, $additional_domains );
    }

    print_r( $allowed_domains );
}
add_action('admin_head', 'custom_function');


function send_domains_to_custom_function( $domains ) {
    return $domains;
}
add_filter( 'custom_function', 'send_domains_to_custom_function', 10, 1 );


$add_these_domains = array(
    'domain4.com',
    'domain5.com',
);
apply_filters( 'custom_function', $add_these_domains );

Это результат предыдущего кода:

Array
(
    [0] => domain1.com
    [1] => domain2.com
    [2] => domain3.com
)

Но вот результат, который я хочу получить:

Array
(
    [0] => domain1.com
    [1] => domain2.com
    [2] => domain3.com
    [3] => domain4.com
    [3] => domain5.com
)

Обновление: окончательное полнофункциональное решение

Спасибо @melvin и прояснение для всех, кто может найтипозже, вот что я закончил:

Функция родительской темы:

function custom_function( $additional_domains ) { 
    $allowed_domains = array(
        'domain1.com',
        'domain2.com',
        'domain3.com',
    );

    $additional_domains = apply_filters( 'add_to_allowed_domains', $additional_domains );

    if ( !empty($additional_domains) ) {
        $allowed_domains = array_merge( $allowed_domains, $additional_domains );
    }

    print_r( $allowed_domains );
}
add_action('admin_head', 'custom_function');

Функция дочерней темы и фильтр:

add_filter('add_to_allowed_domains','add_to_domains_fn');
function add_to_domains_fn($domains){
   $domains= array('domain4.com','domain5.com');
   return $domains;
}

Функция родительской темы по-прежнему работаетс исходными разрешенными доменами, определенными в нем.Если дочерняя тема включает add_to_domains_fn () и фильтр, она добавляет дополнительные домены, как и ожидалось.

1 Ответ

0 голосов
/ 16 февраля 2019

См. Следующую функцию из магазина тема wordpress

function storefront_header_styles() {
    $is_header_image = get_header_image();
    $header_bg_image = '';

    if ( $is_header_image ) {
        $header_bg_image = 'url(' . esc_url( $is_header_image ) . ')';
    }

    $styles = array();

    if ( '' !== $header_bg_image ) {
        $styles['background-image'] = $header_bg_image;
    }

    $styles = apply_filters( 'storefront_header_styles', $styles );

    foreach ( $styles as $style => $value ) {
        echo esc_attr( $style . ': ' . $value . '; ' );
    }
}

Вы видели, как apply_filters применяется для того, чтобы использовать переменную $styles?

$styles = apply_filters( 'storefront_header_styles', $styles );

Либо тема должна поместить фильтр в позицию, либо вы должны вручную добавить apply_filter к теме.

# ОБНОВЛЕНИЕ

На самом деле я не понимаю, какой код есть у функции theme и child theme.Предполагая, что я правильно понял, вам нужно что-то следующее

function custom_function( $additional_domains ) { 
    $allowed_domains = array(
        'domain1.com',
        'domain2.com',
        'domain3.com',
    );
    $allowed_domains = apply_filters( 'add_to_allowed_domains', $allowed_domains );
    if ( $additional_domains ) {
        array_push( $allowed_domains, $additional_domains );
    }

    print_r( $allowed_domains );
}
add_action('admin_head', 'custom_function');

После изменения функции, как указано выше, вы можете использовать

add_filter('add_to_allowed_domains','add_to_domains_fn');
function add_to_domains_fn($domains){
   $domains= array('domain4.com','domain5.com');
   return $domains;
}

NB: Так какФункция в родительской теме не имеет никаких фильтров, добавление apply_filters вручную не рекомендуется.Потому что изменения будут отменены при следующем обновлении темы.Поэтому вы можете попросить разработчика темы добавить туда фильтр

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