Как загружать JS и CSS только на определенных страницах используя is_page()?

5 янв. 2016 г., 18:52:07
Просмотры: 47.4K
Голосов: 11

Я разрабатываю свой первый плагин 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');

К сожалению, в моем случае это условное выражение работает некорректно. Есть ли способ достичь того же результата, сопоставляя страницу, выбранную пользователем в форме, с текущей отображаемой страницей?

5
Комментарии

is_page() принимает переменные в качестве параметра. На самом деле, вы можете использовать переменные как параметр для любой PHP-функции, которая принимает параметры. Почему вы говорите, что это не так? Это должно работать, если вы передаете правильное значение в переменной. Я думаю, проблема в том, что переменная содержит не то значение, которое вы ожидаете.

cybmeta cybmeta
5 янв. 2016 г. 19:20:34

Я пробовал сохранить в PHP-переменную заголовок страницы или её ярлык (например, $my_page_id = 'about';), а затем использовать эту переменную как параметр для is_page(), но это не сработало. В кодексе WP я выяснил, что is_page() принимает ID страницы, её заголовок или ярлык в качестве параметров. Я новичок в PHP и WP и подумал, что это означает, что в is_page() можно передавать только строки или числа. Я исправил свой пост, чтобы не вводить других пользователей в заблуждение.

RaymondMik RaymondMik
6 янв. 2016 г. 11:40:49

Можете ли вы показать результат var_dump($page_selected)

WPTC-Troop WPTC-Troop
6 янв. 2016 г. 11:56:22

Теперь я думаю, что ваш вопрос не о реальной проблеме. Мне кажется, вам нужно знать, как получить значение, установленное в форме плагина. Я заметил, что переменная $page_selected не определена в вашем коде. Не могли бы вы показать, как вы создали форму в админ-панели и как сохраняете значения, установленные в этой форме?

cybmeta cybmeta
6 янв. 2016 г. 12:12:02

Вот как я создал свою форму в админ-панели: <select name="page_dropdown"> <option value=""><?php echo esc_attr( __( 'Выбрать страницу' ) ); ?</option> <?php $pages = get_pages(); foreach ( $pages as $page ) { $option = '<option>'; $option.= $page->post_title; $option .= '</option>'; echo $option; } ?> </select> Допустим, я выбираю "test_page_1" в своей форме - var_dump($page_selected) = string(11) "test_page_1";

RaymondMik RaymondMik
6 янв. 2016 г. 12:32:03
Все ответы на вопрос 4
0
10

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

Если у вас возникают проблемы, лучше хранить ID страницы в базе данных и использовать его с функцией is_page().

Подробнее о возможных аргументах, которые можно передать в это условное выражение, смотрите в официальной документации WordPress.

5 янв. 2016 г. 19:19:24
1

Я внес некоторые полезные изменения и надеюсь, что они вам помогут. Попробуйте следующий код:

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.

9 янв. 2016 г. 13:13:14
Комментарии

Для корректной работы скрипты должны быть добавлены в очередь в правильный момент во время загрузки страницы. Если они загружаются слишком поздно, они могут вообще не работать. Поэтому их нужно привязать к действию wp_enqueue_scripts.

AddWeb Solution Pvt Ltd AddWeb Solution Pvt Ltd
9 янв. 2016 г. 15:00:40
0

Если вы запускаете этот код внутри файла шаблона, он будет работать корректно, но если этот код находится в functions.php или в файле плагина, он вызовет следующую ошибку в debug.log:

PHP Notice: is_page был вызван некорректно. Условные теги запросов не работают до выполнения запроса. До этого они всегда возвращают false.

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

18 сент. 2017 г. 03:32:13
0

Не проверялось... но что-то вроде этого должно работать для получения имени (т.е. слага) текущей отображаемой страницы:

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) внутри этой функции...

5 янв. 2016 г. 19:21:29