programing

word press: 단축코드가 표시되는 경우에만 javascript 로드

muds 2023. 3. 27. 21:42
반응형

word press: 단축코드가 표시되는 경우에만 javascript 로드

재미있는 난제를 안고 있다javascript 파일 8개 정도와 플러그인 스타일 수가 동일합니다.이것들은 쇼트코드가 실행되는 곳에만 필요합니다.

print_styles와 print_scripts로 로드하려고 했는데 제대로 렌더링되지 않아 xhtml 검증이 깨집니다.따라서 현재 모든 페이지에 로딩되어 있고 파일 수 때문에 이대로 둘 수는 없습니다.

다른 프로젝트에서는 플러그인 index.php 파일에 현재 페이지를 가져와서 쇼트 코드를 검색하고, 그때만 발견되면 스크립트가 인쇄되는 함수를 작성했습니다만, 이것은 보기 흉한 해킹입니다.

제안이나 해결책을 가진 사람이 있나요?어떤 도움이라도 주시면 고맙겠습니다, 다이티 씨

내 질문에 대답할 수 있도록...처음 썼을 때 썼어각 페이지를 검색하여 쇼트코드가 사용되고 있는지 확인해야 합니다.페이지 데이터가 로드되고 페이지가 표시되기 전에 수행해야 합니다.나에게 그것은 시스템에 대한 완전한 과잉 살상입니다만, 불행하게도 그것은 그대로입니다.이 정보는 get_shortcode_regex old 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 
  }
}

'YOUR SHORT CODE'를 쇼트 코드 이름으로 대체하고 //숏 코드가 사용되고 있다고 표시된 위치에 wp_enqueue_scripts를 추가합니다.

여기서 솔루션을 읽었습니다.http://scribu.net/wordpress/conditional-script-loading-revisited.html 기본적으로 워드프레스 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
}

쇼트 코드를 사용한 페이지 단위의 스크립트 및 스타일 동적 로드

이점

  • 쇼트 코드가 호출될 때마다 모든 투고를 검색하지는 않습니다.
  • 페이지에 쇼트 코드가 있는 경우에만 스타일과 스크립트를 동적으로 추가할 수 있습니다.
  • .strstr() ★★★★★★★★★★★★★★★★★」strpos(). 가 있는 를 " " " " " " " " " " regex " " " " " " 。
  • 파일 호출 감소

코드의 설명

  1. .save_post, 한 「」와 하는 에만, 훅 합니다.post_type

  2. ID 를, 「ID」를 사용해 합니다.add_option()엔트리가 아직 존재하지 않는 한 자동 로드가 yes로 설정됩니다. '이렇게'를 사용합니다.update_option()

  3. 합니다.wp_enqueue_scripts 집 전화를 걸다add_scripts_and_styles()★★★★★★ 。

  4. 는 그 후, 「이러다」get_option()페이지 ID 배열을 가져옵니다.의 「」가$page_id에 있습니다.$option_id_array스크립트 및 스타일을 추가합니다.

주의:OOP Namesched class에서 코드를 변환했기 때문에 뭔가 놓쳤을 수 있습니다.그랬다면 댓글로 알려주세요.

코드 예:쇼트 코드 발생 검색

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

이 튜토리얼을 읽어주세요.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...]가 있는 경우 스크립트가 추가됩니다.

투고/페이지에 쇼트코드가 있는 경우 스크립트 및 스타일 로드

가장 좋은 해결책은 현재 게시물 또는 페이지에 내용 안에 짧은 코드가 있는 경우에만 페이지 헤더에 파일을 로드하는 것입니다.그리고 이것이 바로 다음 기능이 하는 것입니다.

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 - short code ]를 검색할 쇼트코드로 치환해야 합니다.또한 plugin_styles.css를 스타일시트 이름으로 치환해야 합니다.

이 코드를 사용하여 단축 코드가 페이지 내용 또는 사이드바 위젯에 구현되었는지 확인할 수 있습니다.

<?php

if ( shortcode_exists( 'gallery' ) ) {
    // The [gallery] short code exists.
}

?>

OOP 스타일의 코드와 함께 WordPress Version 5.4를 사용하고 있습니다.이것이 위의 솔루션 중 어느 것도 나에게 효과가 없는 이유에 영향을 주는지는 모르겠지만, 이 솔루션을 제안합니다.

public function enqueue_scripts() {
 global $post;
 //error_log( print_r( $post, true ) );
 //error_log( print_r(  $post->post_content, true ) );
 //error_log( print_r(  strpos($post->post_content, '[YOUR_SHORTCODE]'),true));

 if ( is_a( $post, 'WP_Post' ) && strpos($post->post_content, '[YOUR_SHORTCODE]') ) 
 {
     wp_register_style('my-css', $_css_url);
     wp_register_script('my-js', $_js_url);
 }
}

이게 도움이 됐으면 좋겠네요.

이러한 스크립트는 몇 페이지에 로드됩니까?페이지 배열을 유지하고 현재 페이지가 배열에 있을 때만 스크립트/스타일시트를 로드할 수 있습니까?

그렇지 않으면 WP는 페이지 로딩이 끝날 때까지 쇼트코드가 존재하는지조차 모르기 때문에 코드를 스캔하지 않으면 방법이 없습니다.

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 요청이 줄어들고 로드 시간이 단축된다는 것을 의미합니다.

언급URL : https://stackoverflow.com/questions/6235338/wordpress-loading-javascript-only-where-shortcode-appears

반응형