WordPress: загрузка JavaScript только там, где появляется шорткод - PullRequest
10 голосов
/ 04 июня 2011

есть интересная головоломка. Мне нужно загрузить около 8 файлов JavaScript и столько же стилей для моего плагина. Они нужны только там, где когда-либо запускался мой шорткод.

Я пытался загрузить их с print_styles и print_scripts, но они не рендерится должным образом, плюс это нарушает проверку xhtml. Таким образом, в данный момент они загружаются на каждой странице, и из-за необходимого количества файлов не представляется возможным оставить это так.

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

Кто-нибудь получил какие-либо предложения или решения? любая помощь будет оценена, С уважением, Dáithí

Ответы [ 7 ]

7 голосов
/ 07 июня 2011

чтобы ответить на мой собственный вопрос ... Мне пришлось написать в первый раз. Вы должны искать каждую страницу, чтобы убедиться, что ваш шорткод используется. Это должно быть сделано, когда данные страницы загружены и перед отображением страницы. Для меня это полное излишество в системе, но, к сожалению, так оно и есть. Я получил эту информацию от: get_shortcode_regex а также старый клочок

Итак, сначала:

add_action('template_redirect','wp_my_shortcode_head');

, то:

function wp_my_shortcode_head(){
  global $posts;
  $pattern = get_shortcode_regex(); 
  preg_match('/'.$pattern.'/s', $posts[0]->post_content, $matches); 
  if (is_array($matches) && $matches[2] == 'YOURSHORTCODE') { 
        //shortcode is being used 
  }
}

замените YOURSHORTCODE именем вашего шорткода и добавьте ваши wp_enqueue_scripts туда, где говорится, // что используется шорткод.

4 голосов
/ 21 февраля 2014

Динамическая загрузка скриптов и стилей на странице с использованием шорткода

Преимущества

  • Не выполняет поиск по всем сообщениям при каждом вызове шорткода.
  • Возможность динамического добавления стилей и сценариев только при наличии шорткода на странице.
  • Не использует регулярные выражения, поскольку они, как правило, медленнее, чем strstr() или strpos().Если вам нужно получить аргументы, вы должны использовать регулярное выражение шорткода, упомянутое выше.
  • Сокращает количество файловых вызовов

Объяснение кода

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

  2. Сохраняет найденные идентификаторы записей в виде массива, используя add_option() с автозагрузкой, установленной на да, если запись уже не присутствует.Тогда он будет использовать update_option().

  3. Использует ловушку wp_enqueue_scripts для вызова нашей add_scripts_and_styles() функции.

  4. Эта функция затем вызывает get_option() для получения нашего массива страницидентификаторы.Если текущий $page_id находится в $option_id_array, он добавляет сценарии и стили.

Обратите внимание: Я преобразовал код из классов пространства имен ООП, поэтому, возможно, что-то пропустил.Дайте мне знать в комментариях, если я это сделал.

Пример кода: поиск шорткода

function find_shortcode_occurences($shortcode, $post_type = 'page')
{
    $found_ids = array();
    $args         = array(
        'post_type'   => $post_type,
        'post_status' => 'publish',
        'posts_per_page' => -1,
    );
    $query_result = new WP_Query($args);
    foreach ($query_result->posts as $post) {
        if (false !== strpos($post->post_content, $shortcode)) {
            $found_ids[] = $post->ID;
        }
    }
    return $found_ids;
}

function save_option_shortcode_post_id_array( $post_id ) 
{
    if ( wp_is_post_revision( $post_id ) OR 'page' != get_post_type( $post_id )) {
        return;
    }
    $option_name = 'yourprefix-yourshortcode';
    $id_array = find_shortcode_occurences($option_name);
    $autoload = 'yes';
    if (false == add_option($option_name, $id_array, '', $autoload)) update_option($option_name, $id_array);
}

add_action('save_post', 'save_option_shortcode_id_array' );

Пример кода: шорткод, динамически включающий скрипты и стили

function yourshortcode_add_scripts_and_styles() {
    $page_id = get_the_ID();
    $option_id_array = get_option('yourprefix-yourshortcode');
    if (in_array($page_id, $option_id_array)) {
        wp_enqueue_script( $handle, $src, $deps, $ver, $footer = true );
        wp_enqueue_style( $handle, $src , $deps);
    }
}

add_action('wp_enqueue_scripts', 'yourshortcode_add_scripts_and_styles');
4 голосов
/ 03 февраля 2014

Я читаю решение здесь: http://scribu.net/wordpress/conditional-script-loading-revisited.html По сути, если вы используете WordPress 3.3, вы можете ставить свои скрипты в очередь в функции короткого кода.

function my_shortcode($atts){
    wp_enqueue_script( 'my-script', plugins_url( 'plugin_name/js/script.js' ), array('jquery'), NULL, true);

    // if you add a css it will be added to the footer
//wp_enqueue_style( 'my-css', plugins_url( 'plugin_name/css/style.css' ) );

    //the rest of shortcode functionality
}
1 голос
/ 04 сентября 2013

Просто прочитайте этот учебник здесь: http://scribu.net/wordpress/optimal-script-loading.html

Кажется, что это лучший способ.

add_action('init', 'register_my_script');
add_action('wp_footer', 'print_my_script');

function register_my_script() {
    wp_register_script('my-script', plugins_url('my-script.js', __FILE__), array('jquery'), '1.0', true);
}

function print_my_script() {
    global $add_my_script;

    if ( ! $add_my_script )
        return;

    wp_print_scripts('my-script');
}

В этом случае сценарий будет поставлен в очередь, только если$ add_my_script global был установлен в какой-то момент во время рендеринга страницы.

add_shortcode('myshortcode', 'my_shortcode_handler');

function my_shortcode_handler($atts) {
    global $add_my_script;

    $add_my_script = true;

    // actual shortcode handling here
}

Итак, скрипт будет добавлен, если [myshortcode ...] был найден в любом изсообщений на текущей странице.

0 голосов
/ 20 сентября 2017

Загрузка сценариев и стилей, если сообщение / страница имеет короткий код

Лучшее решение - загрузить файлы в заголовок страницы, если и только если текущее сообщение или страница имееткороткий код внутри его содержимого.И это именно то, что делает следующая функция:

function flip_register_frontend_assets() 
{

// зарегистрировать ваши скрипты и стили здесь

wp_register_style('pp_font','plugin_styles.css', null, null, 'all');

global $post;  

// проверить, имеет ли ваш контент шорткод

if(isset($post->post_content) && has_shortcode( $post->post_content, 'your-
shortcode')){  

// Поставьте в очередь ваши скрипты и стили здесь

 wp_enqueue_style( 'pp_font');

 }
 }

Просто поместите эту функцию в один из ваших файлов плагинов, и все готово.Вам нужно будет заменить [your-shortcode] на короткий код, который вы хотите найти, и вам также нужно будет заменить plugin_styles.css именем вашей таблицы стилей.

0 голосов
/ 04 июня 2011

BraedenP прав, я уверен, что нет способа обнаружить использование шорткода во время выполнения wp_enqueue_scripts / при загрузке таблиц стилей.

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

Вы могли бы рассмотреть решение таблицы стилей PHP, которое выполняет только определенные стили, если это необходимо. Файл css.php может напоминать:

<?php
header("content-type: text/css");
/* You can require the blog header to refer to WP variables and make queries */
//require '../../../wp-blog-header.php';
$css = '';
$css .= file_get_contents('style.css');
/* Consider using GET variables or querying a variable in the WP database to determine which stylesheets should be loaded. You could add an option to the backend that allows a stylesheet to be turned on or off. */
if($condition1 == TRUE) $css .= file_get_contents('condition1.css');
if($condition2 == TRUE) $css .= file_get_contents('condition2.css');
?>

Меньше сценариев и меньше таблиц стилей означает меньше запросов HTTP и более быстрое время загрузки.

0 голосов
/ 04 июня 2011

На скольких страницах будут загружены эти скрипты?Можно ли поддерживать массив страниц и загружать сценарии / таблицы стилей только в том случае, если текущая страница находится в массиве?

В противном случае, без сканирования кода это невозможно сделать, так как WP этого не делает.даже не знаю, шорткод существует до тех пор, пока не загрузится страница.

...