Как включить код только на определенных страницах?

14

Я изучаю плагины и шорткоды. Я заметил, что когда я активирую свой плагин, его код загружается на все мои страницы - даже на те страницы, на которых нет моего шорткода. (Я не имею в виду контент против страниц администратора). На некоторых страницах контента я использую определенный шорткод, а на других страницах контента - нет, но в любом случае код плагина загружается. Как сделать так, чтобы плагин был включен только на страницах, где используется шорткод?

Подробнее:

Допустим, у меня есть плагин, который делает лайтбокс. Я активирую плагин. На моей странице "Cool Images" я использую шорткод для создания лайтбокса. Когда я проверяю View Source на моей странице «About», которая не использует шорткод лайтбокса, я вижу, что код плагина лайтбокса загружен. Мои страницы будут загружаться быстрее, если я напишу свой плагин так, чтобы его код загружался только на тех страницах, где он необходим. Это возможно? В противном случае у меня будет код для множества плагинов, загружаемых на страницах без необходимости. Есть идеи?

Laxmidi
источник
1
Вы пытаетесь поставить что-то в очередь или пытаетесь выполнить скрипт PHP на страницах с шорткодом?
mor7ifer
+1 @ m0r7if3r - я также хотел бы понять, что .. подходы были бы очень разными
krembo99
@ mrOr7if3r, спасибо за сообщение. Например, допустим, у меня есть плагин Google Maps. Нужно ли загружать этот плагин на каждой странице, то есть на страницах, которые не используют плагин? Допустим, у меня есть страница «О программе», на которой нет шорткода Google Maps. Если я смотрю на View Source, я вижу, что код плагина был загружен на эту страницу (событие, хотя я не использую). Должен ли код для плагинов загружаться на каждой странице? Благодарю.
Лакшми
Хороший вопрос, который imho приводит к (новой) лучшей практике, так как WP теперь позволяет нам ставить сценарии в очередь в любой момент времени.
Рафаэль

Ответы:

9

WP v3.3 дал нам возможность запускать wp_enqueue_script в середине страницы. Билет 9346

Это значительно облегчило включение вашего JS с большей детализацией (по крайней мере, при использовании шорткодов). Здесь jquery будет включен только тогда, когда наш шорткод запущен.

function get_slideshow() {
  // Do some stuff...

  // Load up scripts right from within our shortcode function (requires WP 3.3+)
  wp_enqueue_script( 'jquery', array(), null, true  ); 

  return;
}
add_shortcode( 'cool_slideshow', 'get_slideshow' );
Дейв Ромси
источник
1
Вот как это должно быть сделано, IMO.
Рафаэль
1
Отлично, я не осознавал, что теперь можно запустить wp_enqueue_script в середине страницы. Гораздо более чистый способ загрузки скриптов / CSS только при необходимости!
Рик Керран
2

Проверьте переменные пользовательского интерфейса администратора

Один пункт меню является особым случаем: комментарии, поскольку они регистрируются с помощью add_WHATEVER_(submenu)page()API.

// All need to be stated as beeing global
global $pagenow, $typenow, $hook_suffix, $parent_file, $submenu_file, $post_type_object;
if ( 'THE-OUTPUT.php' === $WHATEVER_YOU_CHOOSE_TO_CHECK )
    // do stuff

Они не являются согласованными и жестко закодированы в ядро ​​wp. Обратите внимание, что не все установлены на всех страницах.

Подцепите специфичные для страницы хуки интерфейса администратора

Тогда вы также специальные, страница специфические крючки, которые вы можете взглянуть на в admin-footer.phpи admin-header.php:

// Examples:
// Header
"admin_head-$hook_suffix"
"admin_print_styles-$hook_suffix"
"admin_print_scripts-$hook_suffix"
// Footer
"admin_footer-$hook_suffix"

Несколько примеров из реальной жизни: Post Screen

// Examples how the result looks like
admin_print_styles-post.php
admin_print_styles-post-new.php

Кроме того, есть также то, $hook_suffixчто вы можете проверить для постановки сценариев в очередь, когда вы подключаете свое действие:

do_action( 'admin_enqueue_scripts', $hook_suffix );

Обновить

Чтобы упростить (в один клик) доступ к этим данным / информации, мы создали свободно доступный плагин, удобный для разработчиков, под названием «(Текущая информация администратора) (WCM)» , который доступен на GitHub . Плагин можно в ближайшее время также найти в официальном репозитории wp.org .

Скриншоты

Чтобы получить предварительный просмотр того, что вы получаете с этим плагином:

экран

Крючки

Глобалы

кайзер
источник
0

Может сделать что-то вроде (в header.php):

<?php
        if ( have_posts() && ( is_page() || is_single() ) ) {
            $content = get_the_content(the_post());
            if ( stripos( $content , '[your-shortcode') ) { function_for_scripts(); } 
        }   
?>

Проверяет, является ли текущая загрузка страницей или публикацией, затем захватывает контент и ищет ваш шорткод. Найдя его, он выполняет вашу функцию.

Ноэль Ток
источник
Спасибо за ваше сообщение. Я пытался использовать ваше решение, но, к сожалению, не смог заставить его работать.
Лакшми
Был добавлен в шапку?
Ноэль Ток
1
Вы уже видели get_shortcode_regex()?
Кайзер
0

Самый простой способ - просто проверить шорткод.

function your_scripts()
{ 
    global $post;
    wp_register_script('your-script',$the_path_to_your_script,'0.1',true);
    if ( strstr( $post->post_content, '[your-shortcode' ) ) 
    {
        wp_enqueue_script('your-script');
    }
}
add_action( 'wp_enqueue_scripts', 'your_scripts');
matchdav
источник
1
Есть get_shortcode_regex()для этого.
Кайзер
0

@kaiser отметил get_shortcode_regex()несколько раз в этой теме, я просто подумал, что приведу пример того, как его использовать. Код в значительной степени взят со get_shortcode_regex()справочной страницы WordPress Code.

function enqueue_script_if_shortcode_is_detected() {
    global $post;

    wp_register_script( 'your-script', $the_path_to_your_script, '1.0', true );

    $pattern = get_shortcode_regex();

    if (   preg_match_all( '/'. $pattern .'/s', $post->post_content, $matches )
        && array_key_exists( 2, $matches )
        && in_array( 'your-shortcode', $matches[2] )
    ) {
        wp_enqueue_script('your-script');
    }
}
add_action( 'wp_enqueue_scripts', 'enqueue_script_if_shortcode_is_detected' );
Nicolai
источник
-3

Я нашел это решение :

add_action( 'wp_print_scripts', 'my_deregister_javascript', 100 );

function my_deregister_javascript() {
    wp_deregister_script( 'my_scripts_handle' );
}
Laxmidi
источник
3
Но ваши решения будут удалять сценарии со всех страниц
Мамадука