it-swarm-vi.tech

Nâng cấp

Tôi hiện đang cố gắng phát triển một plugin sẽ nhúng Google Earth Tour vào một WP bài đăng/trang thông qua một mã ngắn.

Vấn đề tôi gặp phải là để tải tour, tôi phải thêm một onload="init()" vào thẻ <body>.

Tôi có thể sửa đổi một tệp mẫu cụ thể, nhưng vì đây là để phát hành, tôi cần thêm nó một cách linh hoạt thông qua một hook. Có ý kiến ​​gì không?

5
Norcross

Đã đào thêm một số thứ và tìm ra cách 'tốt hơn' để làm cho nó hoạt động (Google làm cho khó có thể nhúng Chuyến tham quan Trái đất chết tiệt của họ và tiện ích của họ không hoạt động).

Cuối cùng tôi đã tạo một plugin sử dụng kết hợp một shortcode và trường tùy chỉnh.

0
Norcross

Và đây là một giải pháp jQuery (như Mike đề xuất trong bình luận đầu tiên của anh ấy).

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

Sau đó, thêm một tập lệnh vào trình cắm của bạn thực hiện điều này:

jQuery.noConflict();

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

Điều này sẽ khởi động jQuery ở chế độ không xung đột (nếu chưa có) và thêm một cuộc gọi vào phương thức init() khi tài liệu đã sẵn sàng. Đây là một phương pháp an toàn hơn để sử dụng hơn body onready() vì hàm onready() chỉ có thể gọi một thứ ... vì vậy không ai có thể móc bất cứ thứ gì vào đó hoặc thêm tập lệnh tùy chỉnh. Tốt hơn là làm cho trình cắm của bạn không phô trương nhất có thể để các trình cắm khác không can thiệp hoặc ngược lại.

9
EAMann

Đây là một cách tiếp cận. Tôi tin rằng bạn sẽ thêm cuộc gọi add_action() trong hook của mình. JavaScript tôi bao gồm giả định rằng hàm init đã được xác định. Nếu không, điều này sẽ thất bại, nhưng bao gồm cả kịch bản có vẻ như là một vấn đề bạn đã giải quyết nếu tôi hiểu đúng về bạn. Lưu ý rằng bạn không nhất thiết phải thêm nó vào wp_foot, bạn có thể dễ dàng thêm nó vào 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

Bỏ qua tiềm năng để làm điều này với jQuery một điều bạn có thể làm là móc bộ lọc template_include và sử dụng ob_start()với một cuộc gọi lại. Cuộc gọi lại của bạn sau đó có thể thực hiện tìm kiếm chuỗi trên '<body' và thay thế nó bằng '<body onload="init()"' giống như đoạn mã sau. Bạn sẽ có thể thả nó trực tiếp vào plugin của mình, chỉ cần đảm bảo thay đổi tên để tuân theo quy ước đặt tên riêng của plugin:

<?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);
}

Lưu ý rằng tôi sẽ không cho rằng đoạn mã trên là hoàn toàn mạnh mẽ nếu tôi là bạn. Tôi nghi ngờ nó sẽ xử lý tất cả các trường hợp Edge vì tôi vừa ném nó để trả lời câu hỏi của bạn, nhưng tối thiểu nó chỉ cho bạn cách hoàn thành trường hợp bình thường, và sau đó với một số thử nghiệm trường hợp sử dụng, tôi chắc chắn rằng bạn sẽ xử lý tất cả các trường hợp Edge quan trọng (như nếu '<BODY' là chữ hoa, v.v?)

2
MikeSchinkel

Đây là một số JavaScript để tự động thêm một cuộc gọi lại vào tải trang, có hoặc không có 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' );

Trong trường hợp của bạn, bạn sẽ chỉ thay thế my_onload_callbacks bằng phương thức init của bạn.

1
Annika Backstrom