norcross
  • 0
Гуру

Добавление загрузки в тело

  • 0

В настоящее время я пытаюсь разработать плагин, который будет встраивать Google Earth Tour в пост/страницу WP с помощью шорткода.

Проблема, с которой я сталкиваюсь, заключается в том, что для загрузки тура я должен добавить тег onload="init()" в <body> тег.

Я могу изменить определенный файл шаблона, но, поскольку он предназначен для выпуска, мне нужно добавить его динамически через хук. Есть идеи?

Share
  1. Разве нельзя использовать ненавязчивый Javascript через jQuery?

    • 0
  2. А вот решение jQuery (как предложил Майк в своем первом комментарии).

    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() функция может вызывать только одну вещь… поэтому никто другой не может ничего к ней подключить или добавить собственный скрипт. Лучше сделать свой плагин максимально ненавязчивым, чтобы другие плагины не мешали или наоборот.

    • 0
  3. Вот подход. add_action() Я полагаю, вы бы добавили вызов внутри своего хука. JavaScript, который я включаю, предполагает, что функция инициализации уже определена. Если это не так, то это не удастся, но включение сценария похоже на проблему, которую вы уже решили, если я правильно вас понимаю. Обратите внимание, что вам не обязательно добавлять его в 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');
    ?>
    
    • 0
  4. Игнорируя возможность сделать это с помощью 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' в верхнем регистре и т. д.?)

    • 0
  5. Вот пример JavaScript для динамического добавления обратного вызова к загрузке страницы с использованием jQuery или без него:

    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 своим методом инициализации.

    • 0
  6. Покопался еще немного и нашел «лучший» способ заставить его работать (Google затрудняет встраивание своих чертовых Earth Tours, а их гаджет не работает).

    В итоге я сделал плагин, который использует комбинацию шорткода и настраиваемого поля.

    • 0

Оставить ответ

You must login to add an answer.