Передача параметра для фильтрации и действий

Является способом передать свои собственные параметры функции в add_filter или add_action. Например, посмотрите в следующем коде:

function my_content ($ content, $ my_param)
{
сделай что-нибудь...
используя $ my_param здесь ...
return $ content;
}
add_filter ('the_content', 'my_content', 10, 1);

Могу ли я передать свой собственный параметр? что-то вроде:

add_filter ('the_content', 'my_content ($ my_param)', 10, 1)

или

add_filter ('the_content', 'my_content', 10, 1, $ my_param)
49 голосов | спросил Aakash Chakravarthy 17 MarpmSat, 17 Mar 2012 15:24:53 +04002012-03-17T15:24:53+04:0003 2012, 15:24:53

7 ответов


73

По умолчанию это невозможно. Возможны обходные пути, если вы сделаете это способом ООП.
Вы можете создать класс для хранения значений, которые вы хотите использовать позже.

Пример:

/**
 * Сохраняет значение и вызывает любую существующую функцию с этим значением.
 * /
класс WPSE_Filter_Storage
{
    /**
     * Заполняется __construct (). Используется __call ().
     *
     * @type mixed Любой тип, который вам нужен.
     * /
    частные значения $;

    /**
     * Сохраняет значения для последующего использования.
     *
     * @param mixed $ values
     * /
    public function __construct ($ values)
    {
        $ this-> values ​​= $ values;
    }

    /**
     * Улавливает все вызовы функций, кроме __construct ().
     *
     * Помните: даже если функция вызывается только одной строкой в ​​качестве
     * аргумент будет отправлен как массив.
     *
     * @param string $ callback Название функции
     * @param array $ arguments
     * @второйный смешанный
     * @throws InvalidArgumentException
     * /
    public function __call ($ callback, $ arguments)
    {
        if (is_callable ($ callback))
            return call_user_func ($ callback, $ arguments, $ this-> values);

        //Вызывается неправильная функция.
        throw new InvalidArgumentException (
            sprintf ('Файл:% 1 $ s <br> Линия% 2 $ d <br> Не разрешено:% 3 $ s',
                __FILE__, __LINE__, print_r ($ callback, TRUE)
            )
        );
    }
}

Теперь вы можете вызвать класс с любой функцией, которую вы хотите, - если функция существует где-то, она будет вызываться с вашими сохраненными параметрами.

Давайте создадим демо-функцию â € |

/**
 * Функция фильтра.
 * @param array $ content
 * @param array $ numbers
 * @return string
 * /
функция wpse_45901_add_numbers ($ args, $ numbers)
{
    $ content = $ args [0];
    return $ content. '& Л; р >' , implode (',', $ numbers). '& Л; /р >';
}

â € | и использовать его один раз â |

add_filter (
    'Контент',
    массив (
        новый WPSE_Filter_Storage (массив (1, 3, 5)),
        'wpse_45901_add_numbers'
    )
);

â € | и снова â € |

add_filter (
    'Контент',
    массив (
        новый WPSE_Filter_Storage (массив (2, 4, 6)),
        'wpse_45901_add_numbers'
    )
);

Вывод:

  

введите описание изображения здесь

Ключ reusability : вы можете повторно использовать класс (и в наших примерах также функцию).

PHP 5.3 +

Если вы можете использовать PHP версии 5.3 или новее закрытия , это будет намного проще:

$ param1 = '<p> Это работает! </p>';
$ param2 = 'Это тоже работает!';

add_action ('wp_footer', function () use ($ param1) {
        echo $ param1;
    }, 11
);
add_filter ('the_content', функция ($ content) use ($ param2) {
        return t5_param_test ($ content, $ param2);
    }, 12
);

/**
 * Добавить строку для публикации контента
 *
 * @param string $ content
 * @param string $ string В нашем примере это $ param2.
 * @return string
 * /
функция t5_param_test ($ content, $ string)
{
    return "$ content <p> <b> $ string </b> </p>";
}

Недостатком является то, что вы не можете писать модульные тесты для замыканий.

ответил fuxia 17 MarpmSat, 17 Mar 2012 22:32:12 +04002012-03-17T22:32:12+04:0010 2012, 22:32:12
1

Создайте функцию с необходимыми аргументами, которые возвращают функцию. Передайте эту функцию (анонимная функция, также называемая закрытием) на wp-hook.

Показан здесь для уведомления администратора в бэкэнде Wordpress.

публичная функция admin_notice_func ($ message = '')
{
$ class = 'error';
    $ output = sprintf ('<div class = "% s"> <p>% s </p> </div & gt ;, $, $ class, $ message);
    $ func = function () use ($ output) {print $ output; };
    return $ func;
}
$ func = admin_notice_func ('Message');
add_action ('admin_notices', $ func);
ответил hornament 20 Jpm1000000pmWed, 20 Jan 2016 21:53:14 +030016 2016, 21:53:14
1

Я знаю, что время прошло, но у меня возникла проблема с передачей моего собственного параметра, пока я не обнаружил, что 4-й параметр в add_filter - это число переданных параметров , включая содержимое для изменения. Поэтому, если вы передадите 1 дополнительный параметр, число должно быть 2 , а не 1 в вашем случае

add_filter ('the_content', 'my_content', 10, 2, $ my_param)

и используя

function my_content ($ content, $ my_param) {...}
ответил giacoder 16 FebruaryEurope/MoscowbThu, 16 Feb 2017 15:48:58 +0300000000pmThu, 16 Feb 2017 15:48:58 +030017 2017, 15:48:58
0

, если вы создаете свой собственный крючок, вот пример.

//позволяет сказать, что у нас есть три параметра [https://codex.wordpress.org/Function_Reference/add_filter]
add_filter ('filter_name', 'my_func', 10, 3);
my_func ($ first, $ second, $ third) {
  //код
}

затем выполните hook:

//[https://codex.wordpress.org/Function_Reference/apply_filters]
echo apply_filters ('filter_name', $ first, $ second, $ third);
ответил T.Todua 14 Maypm15 2015, 12:20:16
0

Используйте php Анонимные функции :

$ my_param = 'my theme name';
add_filter ('the_content', функция ($ content) use ($ my_param) {
    //$ my_param теперь доступен для вас
    if (is_page ()) {
        $ content = $ my_param. ': & Л; BR >' , $ Содержание;
    }
    return $ content;
}, 10, 1);
ответил Wesam Alalem 23 Jpm1000000pmSat, 23 Jan 2016 13:26:32 +030016 2016, 13:26:32
0

Вы всегда можете использовать глобальный, не так ли?

global $ my_param;
ответил samjco 25 AM00000020000000831 2017, 02:47:08
-1

Я надеялся сделать то же самое, но поскольку это невозможно, я предполагаю, что простым обходным решением является вызов другой функции, например     add_filter ('the_content', 'my_content_filter', 10, 1);

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

ответил Pierre-Verthume Larivière 13 WedEurope/Moscow2017-12-13T00:24:31+03:00Europe/Moscow12bEurope/MoscowWed, 13 Dec 2017 00:24:31 +0300 2017, 00:24:31

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132