Как только вы поймете, что такое Shortcode API и как работают фильтры, их легко реализовать в WordPress.
И когда вы можете смешивать их, вы можете сделать гораздо больше, чем обычно, когда они работают независимо друг от друга.
В частности, вы можете фильтровать данные, полученные в результате шорткода, и это может быть особенно полезно для других разработчиков. Если вы знакомы с реализацией пользовательских фильтров, то выполнение этого в контексте короткого кода не сильно отличается.
Но если вы никогда раньше не использовали ни API шорткода, ни функциональность, это все равно легко сделать.
Пользовательские фильтры с короткими кодами
В этом посте мы будем использовать относительно надуманный пример. То есть шорткод выльется во что-то статичное. Причина в том, что это упрощает демонстрацию в посте и реализацию в вашем коде.
Шорткод
Чтобы реализовать шорткод, вам нужны две вещи:
- пользовательское имя для шорткода,
- функция, которая используется для передачи информации везде, где используется шорткод.
<?php
namespace Acme;
add_shortcode('a_simple_example', __NAMESPACE__. 'aSimpleExample');
/**
* Replaces [a_simple_example] short code with the text "This is the result of an example shortcode."
* whenever the shortcode is placed in a post or page.
*/
function aSimpleExample()
{
return 'This is the result of an example shortcode.';
}
Примечание в приведенном выше коде; Я поставил перед функцией префикс. __NAMESPACE__Это связано с тем, что функция находится в пользовательском пространстве имен (которое вы можете увидеть в верхней части файла).
Без этого префикса функция не будет вызываться. Если вы решите не использовать пространства имен, вы можете отказаться как от префикса, так и от начальных косых черт имени вашей функции.
Обратите внимание, что мы вернемся к этой функции, как только у нас будет фильтр.
Фильтр
Добавление пользовательского фильтра аналогично добавлению шорткода. Тебе нужно:
- пользовательское имя фильтра,
- функция, которая используется для фильтрации входящей информации (и фильтры обычно должны принимать по крайней мере один параметр, который, конечно же, является данными для фильтрации):
Чтобы соответствовать приведенному выше примеру, скажем, что мы просто хотим заменить несколько слов в шорткоде :
<?php
namespace Acme;
add_filter('custom_shortcode_example', __NAMESPACE__. 'aSimpleShortcodeFilter');
/**
* Replaces [a simple example] short code with the text "This is the result of an example shortcode."
* whenever the shortcode is placed in a post or page.
*
* @param string $input the input to filter.
*
* @return string the result of the filter running on the input
*/
function aSimpleShortcodeFilter(string $input): string
{
return str_ireplace(
'an example shortcode.',
'a filtered shortcode',
$input
);
}
Это заменит содержимое:
Это результат примера шорткода.
К:
Это результат отфильтрованного шорткода.
Но нам все еще нужно связать их вместе.
Пересмотр шорткода
Чтобы связать две функции вместе, нам нужно убедиться, что функция для шорткода применяет фильтр к возвращаемому значению.
К счастью, реализовать это просто, тем более, что у нас есть все, что нам нужно:
<?php
namespace Acme;
add_shortcode('a_simple_example', __NAMESPACE__. 'aSimpleExample');
/**
* Replaces [a_simple_example] short code with the text "This is the result of an example shortcode."
* whenever the shortcode is placed in a post or page.
*/
function aSimpleExample()
{
return apply_filters('custom_shortcode_example', 'This is the result of an example shortcode.');
}
В наиболее конкретном примере я всегда рекомендую проверять, чтобы результат параметра не был пустым, что он содержит строку, которую я ищу, или что-то подобное.
То есть я часто люблю начинать с охранной оговорки. Если тест не пройден, я просто возвращаю входящее значение; в противном случае я буду фильтровать данные и возвращать любой результат этой операции.
