it-swarm.dev

Přidání načtení do těla

V současné době se snažím vytvořit plugin, který vloží prohlídku aplikace Google Earth do WP post/stránky pomocí krátkého kódu.

Problém, na který jsem narazil, je, že pro načtení turné musím do tagu <body> přidat onload="init()".

Můžu upravit specifický soubor šablony, ale protože je to pro vydání, musím ho přidat dynamicky přes háček. Nějaké nápady?

5
Norcross

Udělal nějaké další kopání a našel „lepší“ způsob, jak to fungovat (Google ztěžuje jejich zatracené Earth Tours a jejich gadget nefunguje).

Nakonec jsem udělal plugin , který používá kombinaci krátkého kódu a vlastního pole.

0
Norcross

A tady je řešení jQuery (jak Mike navrhl ve svém prvním komentáři).

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

Pak do skriptu přidejte skript, který to provede:

jQuery.noConflict();

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

Spustí se jQuery v žádném konfliktním režimu (pokud ještě není) a při připraveném dokumentu přidejte volání metody init(). Je to bezpečnější způsob použití než body onready(), protože funkce onready() může volat pouze jednu věc ... takže nikdo jiný nemůže k tomu nic připojit nebo přidat vlastní skript. Je lepší, aby váš plug-in byl co nejneobvyklejší, aby ostatní plug-iny nezasahovaly nebo naopak.

9
EAMann

Tady je přístup. Věřím, že byste přidali volání add_action() do vašeho háku. JavaScript I obsahuje předpokládá, že funkce init již byla definována. Pokud tomu tak není, pak se to nezdaří, ale včetně skriptu se zdá být problém, který jste již vyřešili, když vám rozumím správně. Nezapomeňte, že jej nemusíte přidat do souboru wp_foot, můžete jej také snadno přidat do souboru 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

Ignorování potenciálu udělat to s jQuery jedna věc, kterou můžete udělat, je zavést template_include filtr a použít ob_start()s zpětným volání. Vaše zpětné volání pak může provést řetězec vyhledávání na '<body' a nahradit ho '<body onload="init()"' jako následující kód. Měli byste být schopni jej zavést přímo do pluginu, pouze se změňte jména a postupujte podle vlastní konvence pojmenování pluginu:

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

Všimněte si, že bych nepředpokládal, že výše uvedený kód bude plně robustní, pokud bych byl já. Pochybuji, že to zvládne všechny Edge případy, protože jsem jen hodil to dohromady odpovědět na vaši otázku, ale minimálně to vám ukáže, jak dosáhnout normálního případu, a pak s některými use-case testování Jsem si jistý, že 'to dostat to zvládnout všechny důležité případy Edge (jako co když je '<BODY' velkými písmeny atd.)

2
MikeSchinkel

Zde je několik JavaScriptů, které dynamicky přidávají zpětné volání k načtení stránky s příkazem jQuery nebo bez něj:

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

Ve vašem případě byste jen nahradili my_onload_callbacks vaší metodou init.

1
Annika Backstrom