Мне нужен был способ фильтрации содержимого страницы / публикации перед его загрузкой, чтобы я мог добавить сценарии в заголовок, если присутствовал определенный шорткод. После долгих поисков я наткнулся на это на http://wpengineer.com
function has_my_shortcode($posts) {
if ( empty($posts) )
return $posts;
$found = false;
foreach ($posts as $post) {
if ( stripos($post->post_content, '[my_shortcode') )
$found = true;
break;
}
if ($found){
$urljs = get_bloginfo( 'template_directory' ).IMP_JS;
wp_register_script('my_script', $urljs.'myscript.js' );
wp_print_scripts('my_script');
}
return $posts;
}
add_action('the_posts', 'has_my_shortcode');
который абсолютно блестящий и сделал именно то, что мне нужно.
Теперь мне нужно немного расширить его и сделать то же самое для боковых панелей. Это может быть определенный тип виджета, шорткод, фрагмент кода или что-то еще, что будет работать для определения необходимости загрузки скрипта.
Проблема в том, что я не могу понять, как получить доступ к содержимому боковых панелей до загрузки боковой панели (у рассматриваемой темы будет несколько боковых панелей)
Ответы:
Вы можете использовать функцию is_active_widget . Например:
Чтобы загрузить скрипт на странице, где загружен только виджет, вам нужно добавить код is_active_widget () в ваш класс виджетов. Например, посмотрите виджет недавних комментариев по умолчанию (wp-includes / default-widgets.php, строка 602):
источник
Просто хотел поделиться решением, над которым я работал, что позволило мне быть немного более универсальным с моей реализацией. Вместо того, чтобы проверять функцию на наличие различных шорткодов, я изменил ее, чтобы найти единственный шорткод, который ссылается на функцию сценария / стиля, которую необходимо поставить в очередь. Это будет работать как для методов в других классах (например, для плагинов, которые сами этого не делают), так и для функций в области. Просто поместите приведенный ниже код в functions.php и добавьте следующий синтаксис на любую страницу / пост, где вы хотите конкретные CSS и JS.
Синтаксис страницы / поста: [loadCSSandJS function = "(class-> method / function name)"]
код functions.php:
Это также позволит вам добавить столько, сколько вы хотите на странице. Имейте в виду, что вам нужен метод / функция для загрузки.
источник
Спасибо, что поделились этим советом! Это вызвало у меня небольшую головную боль, потому что сначала это не работало. Я думаю, что есть пара ошибок (возможно, опечатки) в коде выше,
has_my_shortcode
и я переписал функцию, как показано ниже:Я думаю, что было две основные проблемы: проблема
break
не была включена в оператор if, и это приводило к тому, что цикл всегда прерывался на первой итерации. Другая проблема была более тонкой и трудной для обнаружения. Код выше не работает, если шорткод - самое первое, что написано в посте. Я должен был использовать===
оператор, чтобы решить это.В любом случае, большое спасибо за то, что поделились этой техникой, она очень помогла.
источник
В Wordpress 4.7 есть еще один способ добиться этого в вашем
functions.php
файле,сначала вы регистрируете свой скрипт , который на самом деле не печатается на вашей странице, если вы не ставите его в очередь, если вызывается ваш шорткод,
do_shortcode_tag
был введен в WP 4.7 и могут быть найдены в новых разработчиков документации страниц.источник