Wordpress: загрузка javascript только там, где отображается короткий код

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

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

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

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

Ответ 1

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

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

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

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

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

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

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

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

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

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

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' );

Пример кода: Shortcode динамически включает скрипты и стили

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');

Ответ 2

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

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

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 туда, где он говорит//используется короткий код.

Ответ 3

Я читал здесь решение: 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
}

Ответ 4

Просто прочитайте этот учебник здесь: 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');
}

В этом случае 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
}

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

Ответ 5

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

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

Ответ 6

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-запросов и более быстрое время загрузки.

Ответ 7

Загружать скрипты и стили, если Post/Page имеет короткий код

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

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');

 }
 }

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