단축 코드가있을 때 스크립트 / 스타일 큐에 대기


54

플러그인에서 사용하기 위해 스크립트 및 / 또는 스타일을 등록 / 큐에 넣는 아이디어 방법은 무엇입니까?

최근에 간단한 코드로 사용자 아바타 / 그 라비타를 추가 할 수있는 간단한 플러그인 플러그인 을 만들었습니다 . 아바타 (정사각형, 원형 ​​등)를 표시하는 다른 스타일 옵션이 있으며 CSS를 단축 코드 자체에 직접 넣기로 결정했습니다.

그러나 이제는 페이지에서 단축 코드를 사용할 때마다 CSS를 반복하기 때문에 이것이 좋은 접근 방법이 아니라는 것을 알고 있습니다. 이 사이트에서 몇 가지 다른 접근 방식을 보았으며 wp 코덱에는 고유 한 두 가지 예가 있으므로 가장 일관되고 가장 빠른 접근 방법을 알기가 어렵습니다.

현재 알고있는 방법은 다음과 같습니다.

방법 1 : 단축 코드에 직접 포함- 이것은 현재 플러그인에서 수행하고 있지만 코드를 반복하므로 좋지 않습니다.

class My_Shortcode {
function handle_shortcode( $atts, $content="" ) {
/* simply enqueue or print the scripts/styles in the shortcode itself */
?>
<style type="text/css">

</style>
<?php
    return "$content";
     }
}
add_shortcode( 'myshortcode', array( 'My_Shortcode', 'handle_shortcode' ) );

방법 2 : 조건부로 스크립트 또는 스타일을 큐에 넣는 데 클래스 사용

class My_Shortcode {
    static $add_script;
    static function init() {
        add_shortcode('myshortcode', array(__CLASS__, 'handle_shortcode'));
        add_action('init', array(__CLASS__, 'register_script'));
        add_action('wp_footer', array(__CLASS__, 'print_script'));
    }
    static function handle_shortcode($atts) {
        self::$add_script = true;
        // shortcode handling here
    }
    static function register_script() {
        wp_register_script('my-script', plugins_url('my-script.js', __FILE__), array('jquery'), '1.0', true);
    }
    static function print_script() {
        if ( ! self::$add_script )
            return;
        wp_print_scripts('my-script');
    }
}
My_Shortcode::init();

방법 3 : 사용 get_shortcode_regex();

function your_prefix_detect_shortcode() {

    global $wp_query;   
    $posts = $wp_query->posts;
    $pattern = get_shortcode_regex();

    foreach ($posts as $post){
        if (   preg_match_all( '/'. $pattern .'/s', $post->post_content, $matches )
            && array_key_exists( 2, $matches )
            && in_array( 'myshortcode', $matches[2] ) )
        {
            // css/js 
            break;  
        }    
    }
}
add_action( 'wp', 'your_prefix_detect_shortcode' );

방법 4 : 사용 has_shortcode();

function custom_shortcode_scripts() {
    global $post;
    if( is_a( $post, 'WP_Post' ) && has_shortcode( $post->post_content, 'myshortcode') ) {
        wp_enqueue_script( 'my-script');
    }
}
add_action( 'wp_enqueue_scripts', 'custom_shortcode_scripts');

내 생각 Method 4: Using has_shortcode();은 포스트 내용에 관계없이 단축 코드의 여러 용도의 단축 코드가있는 경우 스크립트와 스타일을 한 번로드 할 수 있도록하기 때문에 가장 좋습니다. 위젯이나 사이드 바에서 단축 코드 사용에는 작동하지 않을 수 있지만 확실하지는 않습니다. 플러그인 인 경우 스크립트를 짧은 코드로 묶지 않는 것이 좋습니다. 일부는 짧은 코드 대신 함수를 호출하여 원하는 출력을 얻을 수 있기 때문입니다.
Robert hue

답변:


45

나에게 잘 맞는 다른 방법을 찾았습니다.

다음은 get_avatar를 짧은 코드로 사용할 수있는이 방법을 사용하는 플러그인 예제입니다. 스타일 시트는 단축 코드가있을 때만 대기열에 포함됩니다.

사용법 (ID는 현재 사용자로 기본 설정 됨) :

[get_avatar id="" size="32" default="mystery" alt="Profile Photo" class="round"]

function wpse_165754_avatar_shortcode_wp_enqueue_scripts() {
    wp_register_style( 'get-avatar-style', plugins_url( '/css/style.css', __FILE__ ), array(), '1.0.0', 'all' );
}

add_action( 'wp_enqueue_scripts', 'wpse_165754_avatar_shortcode_wp_enqueue_scripts' );
if ( function_exists( 'get_avatar' ) ) {
    function wpse_165754_user_avatar_shortcode( $attributes ) {

        global $current_user;
        get_currentuserinfo();

        extract( shortcode_atts(
                     array(
                         "id"      => $current_user->ID,
                         "size"    => 32,
                         "default" => 'mystery',
                         "alt"     => '',
                         "class"   => '',
                     ), $attributes, 'get_avatar' ) );

        $get_avatar = get_avatar( $id, $size, $default, $alt );

        wp_enqueue_style( 'get-avatar-style' );

        return '<span class="get_avatar ' . $class . '">' . $get_avatar . '</span>';
    }

    add_shortcode( 'get_avatar', wpse_165754_user_avatar_shortcode' );
}

작년 에이 질문을 잊어 버렸지 만 실제로 많은 경우 에이 방법을 실제로 시작했습니다. 방법 1과 2를 결합하는 것과 비슷합니다.
Bryan Willis

4
이 방법은 바닥 글에 CSS를로드하는데 어떤 제한이 있습니까?
Jacob Raccuia

1
이것이 절대적으로 올바른 방법입니다. wp_enqueue_scripts후크가 이미 발생한 경우 스크립트 또는 스타일 시트를 조건부로로드해야 할 때마다이 방법을 사용하십시오 . (단순한 코드는 구문 분석 중 후크 the_content의 일부이므로 구문 분석시 the_post큐에 넣는 시간이 너무 늦어서 스크립트를 등록하지 않은 경우 너무 늦습니다.)
JRad the Bad

26

대답을 시작하기 전에이 주제와 관련하여 css와 js가 동일하지 않다고 말해야합니다.

이유는 간단합니다. 바닥 글에 페이지 본문에 js를 추가하는 것이 일반적이고 유효한 방법이지만 CSS <head>는 페이지 섹션에 배치해야합니다 . 대부분의 브라우저가 페이지에 CSS를 올바르게 렌더링 할 수있는 경우에도 본문, 유효한 HTML 코드가 아닙니다.

짧은 코드가 렌더링되면 <head>섹션이 이미 인쇄되었으므로 바닥 글에 문제없이 js를 추가 할 수 있지만 짧은 코드가 렌더링 되기 전에 CSS를 추가해야합니다 .

스크립트

단축 코드에 js 만 필요한 경우 운 wp_enqueue_script이 좋으며 단축 코드 콜백 본문에서 사용할 수 있습니다 .

add_shortcode( 'myshortcode', 'my_handle_shortcode' );

function my_handle_shortcode() {
  wp_enqueue_script( 'myshortcodejs', '/path/to/js/file.js' );
  // rest of code here...
}

이렇게하면 페이지에서 단축 코드를 두 번 이상 사용하더라도 스크립트가 바닥 글에 한 번만 추가됩니다.

스타일

코드에 스타일이 필요한 경우 짧은 코드가 실제로 렌더링 되기 전에 동작해야합니다 .

이를 수행하는 다른 방법이 있습니다.

  1. 현재 쿼리의 모든 게시물을보고 필요한 경우 단축 코드 스타일을 추가하십시오. 이것이 OP의 방법 # 3과 # 4에서 수행하는 작업입니다. 실제로 두 가지 방법 모두 동일한 기능을 수행하지만 has_shortcodeWP 3.6에 추가 되었지만 get_shortcode_regex버전 2.5부터 사용할 수 있으므로 get_shortcode_regex플러그인이 이전 버전과 호환 되도록하려면 에만 사용 하십시오.

  2. 모든 페이지에서 항상 단축 코드 스타일 추가

이슈

# 1 문제는 성능입니다. 정규식은 매우 느리게 작동하며 모든 게시물 루프에서 정규식을 시작하면 페이지가 일관되게 느려질 수 있습니다. 또한 테마에서 아카이브의 게시물 발췌 만 표시하고 단일 뷰에서만 짧은 코드로 전체 내용을 표시하는 것은 매우 일반적인 작업입니다. 이 경우 아카이브가 표시되면 플러그인은 절대 사용하지 않는 스타일을 추가하기 위해 루프에서 정규식 일치를 시작합니다. 불필요한 이중 성능 영향 : 페이지 생성 속도 저하 + 불필요한 HTTP 요청 추가

# 2의 문제는 다시 성능입니다. 모든 페이지에 스타일을 추가한다는 것은 필요하지 않은 경우에도 모든 페이지에 대한 추가 HTTP 요청을 추가한다는 의미입니다. 서버 쪽 페이지 생성 시간이 영향을받지 않더라도 총 페이지 렌더링 시간 및 모든 사이트 페이지에 적용됩니다.

플러그인 개발자는 무엇을해야합니까?

가장 좋은 방법은 플러그인에 옵션 페이지를 추가하는 것입니다. 여기서 단축 코드를 단일 보기로 만 또는 아카이브에서 처리해야하는지 사용자가 선택할 수 있습니다. 두 경우 모두 짧은 코드를 사용할 수있는 게시물 유형을 선택할 수있는 다른 옵션을 제공하는 것이 좋습니다.

이런 식으로 "template_redirect"현재 쿼리가 요구 사항을 충족하는지 확인하고이 경우 스타일을 추가 할 수 있습니다.

사용자가 단일 게시물보기에서만 단축 코드를 사용하기로 선택한 경우 게시물에 단축 코드가 있는지 여부를 확인하는 것이 좋습니다. 한 번의 정규 표현식 만 있으면 페이지 속도가 너무 느려지지 않아야합니다.

사용자도 문서 보관소에 단축 코드를 사용하기로 선택한 경우, 게시물의 번호 인 경우 다음 나는 모든 게시물에 대한 정규식을 실행하는 피할 것이다 높은 단지 스타일의 경우 쿼리에 맞는 요구 사항을 큐에 넣습니다.

이와 관련하여 "높은"것으로 간주되는 것은 일부 성능 테스트를 사용하거나 대안으로 다른 옵션을 추가하고 사용자에게 선택을 제공해야합니다.


2
<style>문서 본문의 태그가 이제 W3C 사양에 따라 유효 하다는 점에 주목할 가치가 있습니다 . w3.org/TR/html52/document-metadata.html#the-style-element
Isaac Lubow

5

내 플러그인의 경우 사용자에게 간혹 메타 데이터에 저장된 단축 코드가있는 테마 빌더가 있음을 발견했습니다 . 플러그인 단축 코드가 현재 게시물 또는 게시물 메타 데이터에 있는지 여부를 감지하는 데 사용하는 내용은 다음과 같습니다 .

function abcd_load_my_shorcode_resources() {
       global $post, $wpdb;

       // determine whether this page contains "my_shortcode" shortcode
       $shortcode_found = false;
       if ( has_shortcode($post->post_content, 'my_shortcode') ) {
          $shortcode_found = true;
       } else if ( isset($post->ID) ) {
          $result = $wpdb->get_var( $wpdb->prepare(
            "SELECT count(*) FROM $wpdb->postmeta " .
            "WHERE post_id = %d and meta_value LIKE '%%my_shortcode%%'", $post->ID ) );
          $shortcode_found = ! empty( $result );
       }

       if ( $shortcode_found ) {
          wp_enqueue_script(...);
          wp_enqueue_style(...);
       }
}
add_action( 'wp_enqueue_scripts', 'abcd_load_my_shorcode_resources' );

2

나는 그렇게 :

class My_Shortcode {

    function __construct() {
        do_action('my_start_shortcode'); // call
....

다른 기능 (또는 다른 플러그인)에서 후크를 잡으십시오.

function wpse_3232_load_script(){
    wp_enqueue_script('js-myjs');
}
add_action('my_start_shortcode','wpse_3232_load_script',10);

1

텍스트 위젯에 단축 코드가 있으면 내 플러그인을 찾았습니다.

function check_shortcode($text) {

  $pattern = get_shortcode_regex();

   if (   preg_match_all( '/'. $pattern .'/s', $text, $matches )
        && array_key_exists( 2, $matches )
        && in_array( 'myshortcode', $matches[2] ) )
    {
        // myshortcode is being used

        // enque my css and js
        /****** Enqueu RFNB  ******/
        wp_enqueue_style('css-mycss');
        wp_enqueue_script('js-myjs');

        // OPTIONAL ALLOW SHORTCODE TO WORK IN TEXT WIDGET
        add_filter( 'widget_text', 'shortcode_unautop');
        add_filter( 'widget_text', 'do_shortcode'); 

    }

  return $text;

}
add_filter('widget_text', 'check_shortcode');

1

WordPress에는 특정 단축 코드 제시 상태를 기반으로 무언가를 수행하는 기능이 내장되어 있습니다. 기능 이름은 has_shortcode()입니다. 다음 코드를 사용하여 스타일과 스크립트를 큐에 넣을 수 있습니다.

저는 여기에 사용 된 is_a( $post, 'WP_Post' )있는지 확인하는 $post객체가입니다 WP_Post클래스와 내가 사용하는 $post->post_content게시물 내용을 확인 할 수 있습니다.

if ( is_a( $post, 'WP_Post' ) && has_shortcode( $post->post_content, 'shortcode_tag') ) {
    wp_enqueue_style( 'handle', get_template_directory_uri() . '/your_file_filename.css' );
}

0

has_shortcode ()zndencka가 제공 한 답변에 대한 Wordpress 페이지의 예제 코드 조합을 만들었습니다 . has_shortcode 함수가 Wordpress 3.6에 추가되었으므로 함수가 있는지 먼저 확인합니다. 워드 프레스에 따라 워드 프레스 3.6보다 많은 사용자가 더 이상 없기 때문에 그 검사는 약간 쓸모가 없을 수도 있습니다.

// This makes sure the styling is already enqueued in the header, so before the shortcode loads in the page/post
function enqueue_shortcode_header_script() {
    global $post;
    if ( function_exists( 'has_shortcode' ) ){  // is added in wordpress 3.6
        // Source: https://codex.wordpress.org/Function_Reference/has_shortcode
        if( is_a( $post, 'WP_Post' ) && has_shortcode( $post->post_content, 'my_shortcode') ) {
            wp_enqueue_style( 'shortcode-css' );
        }
    }
    else if ( isset($post->ID) ) { // Small percentage wordpress users are below 3.6 https://wordpress.org/about/stats/
        global $wpdb;
        $result = $wpdb->get_var(
          $wpdb->prepare(
              "SELECT count(*) FROM $wpdb->postmeta " .
              "WHERE post_id = %d and meta_value LIKE '%%my_shortcode%%'",
               $post->ID )
        );
        if (!empty( $result )) { wp_enqueue_style( 'shortcode-css' ); }
    }
}
add_action( 'wp_enqueue_scripts', 'enqueue_shortcode_header_script');

0

지나치게 복잡한 함수를 사용하지 않고도 짧은 코드를 통해 CSS 및 JS 파일을 조건부로로드 할 수 있습니다 .

먼저 모든 CSS / JS 파일을 미리 등록했다고 가정 해 봅시다 (어쩌면 실행될 때 wp_enqueue_scripts).

function prep_css_and_js() {
     wp_register_style('my-css', $_css_url);
     wp_register_script('my-js', $_js_url);
}
add_action( 'wp_enqueue_scripts', 'prep_css_and_js', 5 );

다음으로 단축 코드 기능을 살펴 보겠습니다.

function my_shortcode_func( $atts, $content = null ) {
  if( ! wp_style_is( "my-css", $list = 'enqueued' ) ) { wp_enqueue_style('my-css'); }
  if( ! wp_script_is( "my-js", $list = 'enqueued' ) ) { wp_enqueue_script('my-js'); }
  ...
}

단순한. 끝난. Ergo : CSS / js 파일을 조건부로로드 할 수 있습니다 ([shortcode]가 실행될 때만).

다음과 같은 이념을 고려해 봅시다.

  • 특정 CSS / JS 파일을로드하려고합니다 (단축 코드가 트리거 된 경우에만)
  • 어쩌면 모든 파일에 해당 파일을로드하지 않거나 페이지 / 포스트에서 단축 코드를 사용하지 않는 경우도 있습니다. (경량)
  • WP는 단축 코드를 호출하기 전에 그리고 큐에 넣기 전에 모든 css / js 파일을 등록하도록함으로써이를 달성 할 수 있습니다.
  • IE : 어쩌면 내 prep_css_and_js()기능 중에 특정 폴더에있는 모든 .css / .js 파일을로드 할 수 있습니다 ...

이제 WP가 그것들을 등록 된 스크립트로 보았으므로, 우리는이를 포함하되 이에 국한되지 않는 상황의 진실성을 기반으로 조건부로 호출 할 수 있습니다. my_shortcode_func()

장점 : (MySQL, 고급 기능 및 필터 불필요)

  • 이것은 "WP 정통", 우아하고 빠른 로딩, 쉽고 간단합니다
  • 컴파일러 / 분쇄기가 이러한 스크립트를 감지 할 수 있도록합니다.
  • WP 함수를 사용합니다 (wp_register_style / wp_register_script)
  • 여러 가지 이유로 해당 스크립트를 등록 취소하려는 더 많은 테마 / 플러그인과 호환됩니다.
  • 여러 번 트리거하지 않습니다
  • 처리 또는 코드가 거의 없습니다

참고 문헌 :

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.