Мне нужен был способ фильтровать содержимое страницы/сообщения до его загрузки, чтобы я мог добавлять скрипты в заголовок, если присутствовал определенный шорткод. После долгих поисков я наткнулся на 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');
который абсолютно великолепен и сделал именно то, что мне нужно.
Теперь мне нужно немного расширить его и сделать то же самое для боковых панелей. Это может быть определенный тип виджета, шорткод, фрагмент кода или что-то еще, что поможет определить, когда скрипт необходимо загрузить.
Проблема в том, что я не могу понять, как получить доступ к содержимому боковых панелей до загрузки боковой панели (рассматриваемая тема будет иметь несколько боковых панелей)
Являются ли сценарии в заголовке жесткими требованиями для вашей ситуации? Сценарии в конце страницы проще использовать условно и рекомендуется для повышения производительности.
Сначала я попробовал это в wp_footer, что избавляет от необходимости предварительной фильтрации содержимого, но хотя скрипты загружались нормально, они не работали. Эти скрипты должны быть в wp_head, чтобы делать то, что им нужно.
Может ли это быть вызвано ДО загрузки виджетов. Чтобы было ясно, это должно произойти еще до того, как страница загрузится. Мой пример кода использует the_posts для фильтрации контента на странице, но не получает боковые панели/виджеты.
Да, смотрите пример, который я добавил к своему ответу.
Ваш пример на самом деле не работает. Я упускаю что-то очевидное?
На самом деле я был. wp_enqueue_script не работает при применении к wp_head, но wp_print_scripts работает. Однако wp_enqueue_script работает, если применяется к инициализации следующим образом: add_action(‘init’, ‘check_widget’);
Однако он загружает скрипты на каждой странице сайта, даже если виджет активен только на одной боковой панели. например, если у меня есть боковая панель для страниц блога и другая боковая панель для других страниц. Я добавляю виджет поиска на боковую панель блога, и скрипты загружаются, но также загружаются на страницах, на которых нет боковой панели блога. Мне нужно иметь возможность загружать скрипт, только если виджет присутствует на этой странице.
Вы можете использовать функцию is_active_widget. Например:
Чтобы загрузить скрипт на страницу, где загружается только виджет, вам нужно будет добавить код is_active_widget() в свой класс виджета. Например, см. виджет последних комментариев по умолчанию (wp-includes/default-widgets.php, строка 602):
Просто хотел поделиться решением, над которым я работал, которое позволило мне быть более универсальным в своей реализации. Вместо того, чтобы функция проверяла различные шорткоды, я изменил ее, чтобы найти один шорткод, который ссылается на функцию сценария/стиля, которую необходимо поставить в очередь. Это будет работать как для методов в других классах (таких как плагины, которые могут не делать этого сами), так и для функций в области видимости. Просто поместите приведенный ниже код в functions.php и добавьте следующий синтаксис на любую страницу/публикацию, где вам нужны определенные CSS и JS.
Синтаксис страницы/сообщения: [loadCSSandJS function=»(class->имя метода/функции)»]
Код functions.php:
Это также позволит вам добавить столько, сколько вы хотите на странице. Имейте в виду, что вам нужен метод/функция для загрузки.
с WordPress 4.7 есть еще один способ добиться этого в вашем
functions.php
файле,сначала вы регистрируете свой скрипт, который на самом деле не печатается на вашей странице, если вы не ставите его в очередь, если вызывается ваш шорткод,
был
do_shortcode_tag
представлен в WP 4.7, и его можно найти на новых страницах документации для разработчиков.Спасибо, что поделились этим советом! Это дало мне небольшую головную боль, потому что сначала это не работало. Я думаю, что в приведенном выше коде есть пара ошибок (возможно, опечатки),
has_my_shortcode
и я переписал функцию, как показано ниже:Я думаю, что было две основные проблемы: это
break
не входило в область действия оператора if, и это приводило к тому, что цикл всегда прерывался на первой итерации. Другая проблема была более тонкой и трудной для обнаружения. Приведенный выше код не работает, если шорткод — это самое первое, что написано в сообщении. Мне пришлось использовать===
оператор, чтобы решить эту проблему.В любом случае, большое спасибо за то, что поделились этой техникой, она очень помогла.