Как загружать JS и CSS только на определенных страницах используя is_page()?
Я разрабатываю свой первый плагин WordPress, который должен загружать JS и CSS файлы только на определенных страницах, выбранных через форму в административной части плагина. После выбора в форме, заголовок страницы сохраняется в таблице wp_options базы данных, затем данные извлекаются в переменную $page_selected. Чтобы загружать JS и CSS файлы только на выбранных в форме страницах, я хотел использовать функцию is_page(), передавая переменную $page_selected в качестве параметра.
function my_custom_tooltip() {
if ( is_page($page_selected) ) {
wp_enqueue_style( 'custom_tooltip_frontend_css', plugins_url('custom-image-tooltip/custom-image-tooltip.css') );
wp_enqueue_script( 'custom_tooltip_frontend_js', plugins_url('custom-image-tooltip/custom-image-tooltip.js'), array('jquery'), '', true );
}
} add_action('wp_enqueue_scripts', 'my_custom_tooltip');
К сожалению, в моем случае это условное выражение работает некорректно. Есть ли способ достичь того же результата, сопоставляя страницу, выбранную пользователем в форме, с текущей отображаемой страницей?

Если $page_selected
возвращает строку с заголовком страницы, всё должно работать корректно. Я проверил, и функция is_page()
принимает заголовок страницы, её ID или слаг.
Если у вас возникают проблемы, лучше хранить ID страницы в базе данных и использовать его с функцией is_page()
.
Подробнее о возможных аргументах, которые можно передать в это условное выражение, смотрите в официальной документации WordPress.

Я внес некоторые полезные изменения и надеюсь, что они вам помогут. Попробуйте следующий код:
function my_custom_tooltip() {
wp_enqueue_style( 'custom_tooltip_frontend_css', plugins_url('custom-image-tooltip/custom-image-tooltip.css') );
wp_enqueue_script( 'custom_tooltip_frontend_js', plugins_url('custom-image-tooltip/custom-image-tooltip.js'), array('jquery'), '', true );
}
if(is_page($page_selected)){
add_action('wp_enqueue_scripts', 'my_custom_tooltip');
}
Здесь убедитесь в правильности значения $page_selected
.
ПРИМЕЧАНИЕ: Всегда подключайте (enqueue) ваши скрипты в файле functions.php темы — не в файле шаблона. Файлы шаблонов — это в 99,9% случаев Неправильное Место для этого.
Вы можете использовать is_page()
в разных вариантах, например:
// Когда отображается любая отдельная Страница.
is_page();
// Когда отображается Страница с ID 42.
is_page( 42 );
// Когда отображается Страница с заголовком (post_title) "Contact".
is_page( 'Contact' );
// Когда отображается Страница с ярлыком (post_name/slug) "about-me".
is_page( 'about-me' );
// Возвращает true, если отображаемая Страница имеет ID 42, или ярлык "about-me", или заголовок "Contact".
is_page( array( 42, 'about-me', 'Contact' ) );
Примечание: Возможность использования массива была добавлена в версии 2.5.

Если вы запускаете этот код внутри файла шаблона, он будет работать корректно, но если этот код находится в functions.php или в файле плагина, он вызовет следующую ошибку в debug.log
:
PHP Notice: is_page был вызван некорректно. Условные теги запросов не работают до выполнения запроса. До этого они всегда возвращают false.
В этом случае вы можете использовать хук действия template_redirect
, как объясняется здесь.

Не проверялось... но что-то вроде этого должно работать для получения имени (т.е. слага) текущей отображаемой страницы:
function my_custom_tooltip() {
global $post;
if ( is_object( $post ) && $post->post_type=='page' ) {
if ( $post->post_name == $page_selected ) {
wp_enqueue_style( 'custom_tooltip_frontend_css', plugins_url('custom-image-tooltip/custom-image-tooltip.css') );
wp_enqueue_script( 'custom_tooltip_frontend_js', plugins_url('custom-image-tooltip/custom-image-tooltip.js'), array('jquery'), '', true );
}
}
}
Сравнение с $page_selected
, конечно, ожидает, что оно будет в формате "слага"... или если сравнивать с заголовком страницы, можно использовать $post->post_title
вместо $post->post_name
.
Примечание: это пример, когда использование PHP-классов полезно, чтобы избежать необходимости использовать глобальную переменную ($page_selected
) внутри этой функции...
