it-swarm-ko.tech

load on request

현재 Google 어스 둘러보기를 짧은 코드로 WP 게시물/페이지에 삽입하는 플러그인을 개발하려고합니다.

내가 겪고있는 문제는 투어를로드하기 위해 <body> 태그에 onload="init()"을 추가해야한다는 것입니다.

특정 템플릿 파일을 수정할 수는 있지만 릴리스 용이므로 후크를 통해 동적으로 추가해야합니다. 어떤 아이디어?

5
Norcross

더 많은 파기를 해보고 그것을 작동시키는 '더 나은'방법을 찾았습니다 (Google은 지저분한 Earth Tours를 임베디드하기가 힘듭니다. 가제트가 작동하지 않습니다).

나는 단축 코드와 사용자 정의 필드의 조합을 사용하는 플러그인 을 만들었습니다.

0
Norcross

그리고 jQuery 솔루션이 있습니다 (Mike가 그의 첫 번째 논평에서 제안했듯이).

function add_my_scripts() {
    wp_enqueue_script('jquery');
    wp_enqueue_script('my_init_script', SCRIPTSRC, 'jquery', '1.0');
}
add_action('init', 'add_my_scripts');

그런 다음이 작업을 수행하는 플러그인을 플러그인에 추가하십시오.

jQuery.noConflict();

jQuery(document).ready(function($) {
    init();
}

그러면 jQuery가 충돌 모드에서 시작되고 (아직없는 경우) 문서가 준비되면 init() 메소드에 대한 호출이 추가됩니다. body onready() 함수는 하나의 함수 만 호출 할 수 있기 때문에 onready()보다 더 안전한 방법입니다 ... 그래서 아무도 다른 함수에 연결하거나 사용자 정의 스크립트를 추가 할 수 없습니다. 가능한 한 플러그인을 방해하지 않는 것이 더 좋으므로 다른 플러그인이 간섭하지 않거나 반대의 경우도 있습니다.

9
EAMann

여기에 접근법이 있습니다. 당신은 당신의 훅 안에 add_action() 콜을 추가 할 것이라고 믿습니다. 포함 된 JavaScript는 init 함수가 이미 정의되어 있다고 가정합니다. 그렇지 않다면 실패 할 것입니다. 그러나 스크립트를 포함하면 내가 올바르게 이해할 경우 이미 해결 한 문제처럼 보입니다. 반드시 wp_foot에 추가 할 필요는 없습니다. wp_head에 쉽게 추가 할 수 있습니다.

<?php

function mypluginprefix_onload_init() { ?>
<script language="text/javascript">
// check for the standards-compliant way to add onload events
if ( typeof(window.addEventListener) !== 'undefined' )
    window.addEventListener( "load", init, false );
// or the older msie nonstandard way
else if ( typeof(window.attachEvent) !== 'undefined' ) {
    window.attachEvent( "onload", init );
}
</script>
<?php }

// this goes in your hook
add_action('wp_foot', 'mypluginprefix_onload_event');
?>
4
artlung

JQuery를 사용하여이 작업을 수행하지 못하게하는 것은template_include 필터를 연결하고 ob_start()을 콜백과 함께 사용하는 것입니다. 그런 다음 콜백은 '<body'에서 문자열 검색을 수행하고 다음 코드와 같이 '<body onload="init()"'으로 바꿀 수 있습니다. 플러그인에서 플러그인을 직접 삭제할 수 있어야합니다. 플러그인 자체의 이름 지정 규칙을 따르도록 이름을 변경해야합니다.

<?php
add_filter('template_include','start_buffer_capture',1);
function start_buffer_capture($template) {
  ob_start('end_buffer_capture');  // Start Page Buffer
  return $template;
}
function end_buffer_capture($buffer) {
  return str_replace('<body','<body onload="init()"',$buffer);
}

위의 코드가 내가 당신이라면 완전히 견고하다는 것을 전제하지 않을 것입니다. 귀하의 질문에 대답하기 위해 함께 던지기 때문에 모든 엣지 케이스를 처리 할 수 ​​있을지는 의문입니다.하지만 최소한의 경우 정상적인 케이스를 수행하는 방법을 보여줍니다. 그런 다음 유스 케이스 테스트를 통해 모든 것을 처리 할 수 ​​있다고 확신합니다. 중요한 엣지 경우 (예 : '<BODY'가 대문자 인 경우 등)

2
MikeSchinkel

다음은 jQuery의 유무에 관계없이 페이지로드에 콜백을 동적으로 추가하는 JavaScript입니다.

function add_onload() {
    ?>
    <script type="text/javascript">
    my_onload_callback = function() { alert('Hello!'); }; // test function

    if( typeof jQuery == "function" ) { 
        jQuery(my_onload_callback); // document.ready
    } else {
        document.getElementsByTagName('body')[0].onload = my_onload_callback; // body.onload
    }
    </script>
    <?php
}
add_action( 'wp_footer', 'add_onload' );

귀하의 경우에는 my_onload_callbacks를 init 메소드로 대체하기 만하면됩니다.

1
Annika Backstrom