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 " " " " " " 。 - 파일 호출 감소
코드의 설명
.
save_post
, 한 「」와 하는 에만, 훅 합니다.post_type
ID 를, 「ID」를 사용해 합니다.
add_option()
엔트리가 아직 존재하지 않는 한 자동 로드가 yes로 설정됩니다. '이렇게'를 사용합니다.update_option()
합니다.
wp_enqueue_scripts
집 전화를 걸다add_scripts_and_styles()
★★★★★★ 。는 그 후, 「이러다」
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
'programing' 카테고리의 다른 글
인수로 전달된 TypeScript 개체의 기본값 설정 (0) | 2023.03.27 |
---|---|
Ruby on Rails에 대한 WordPress 대체 방법은 무엇입니까? (0) | 2023.03.27 |
Spring Boot Application 이름에 프로그래밍 방식으로 액세스하는 방법 (0) | 2023.03.27 |
리소스에 대한 각도 후행 슬래시 (0) | 2023.03.27 |
문자열화할 때마다 JSON.stringify가 큰따옴표를 이스케이프합니다. (0) | 2023.03.27 |