Încărcarea shortcode-ului cu ajax

3 aug. 2013, 21:13:27
Vizualizări: 22.2K
Voturi: 3

Încerc să încarc un slideshow doar dacă browserul are o anumită dimensiune a ecranului - adică nu vreau ca slideshow-ul să se încarce pe ecrane mai mici, mobile. Plugin-ul de slideshow oferă un shortcode:

<?php echo do_shortcode('[metaslider id="8302"]'); ?>

Dar când încerc să-l încarc cu .load(), acesta doar afișează șirul de caractere și nu execută codul php.

Căutând prin site, am găsit câteva postări legate de acest subiect:

apelarea shortcode în javascript De ce s-ar putea ca 'do_shortcode' al unui plugin să nu funcționeze într-o cerere AJAX?

Din păcate, nu am suficientă reputație pentru a adăuga comentarii la acele postări, așa că deschid o nouă întrebare.

Mă întreb dacă cineva poate explica acest lucru într-un mod foarte simplificat pentru cineva care nu este familiarizat cu PHP?

2
Comentarii

Încearcă să încarci ce cu .load()? Te rog postează tot codul relevant.

s_ha_dum s_ha_dum
3 aug. 2013 21:32:16

Când încerc să încărc un fișier php care conține codul de mai sus ( <?php echo do_shortcode('[metaslider id="8302"]'); ?> )

Astfel: $('.homepage__slider').load('wp-content/themes/mytheme/slider.php');

Don't Wake Me Up Don't Wake Me Up
3 aug. 2013 21:49:10
Toate răspunsurile la întrebare 1
4

Nu poți încărca un fișier direct în acest fel:

$('.homepage__slider').load('wp-content/themes/mytheme/slider.php');

De asemenea, reține că WordPress încarcă jQuery în modul noConflict, astfel aliasul $ nu funcționează.

Dacă încarci un fișier direct, niciuna dintre funcțiile WordPress nu va funcționa. Ar trebui să folosești API-ul AJAX pentru ca totul să se încarce în contextul WordPress.

Ai putea încapsula PHP-ul de procesare într-o funcție:

function my_ajax_shortcode_wpse_108874() {
    echo do_shortcode('[metaslider id="8302"]');
    die;
}

Conectează această funcție la sistemul AJAX:

add_action('wp_ajax_my_ajax_shortcode', 'my_ajax_shortcode_wpse_108874()');
add_action('wp_ajax_nopriv_my_ajax_shortcode', 'my_ajax_shortcode_wpse_108874()');

Trimite cererea ta către http://site/wp-admin/admin-ajax.php și pasează my_ajax_shortcode ca argument când JavaScript-ul face o cerere.

var data = {
    action: 'my_ajax_shortcode'
};
jQuery.post(ajax_url, data, function(response) {
    // orice ai nevoie să faci; poate nimic
});

Poți seta ajax_url similar cu acest exemplu din Codex:

add_action( 'admin_enqueue_scripts', 'my_enqueue' );
function my_enqueue($hook) {
    if( 'index.php' != $hook ) return;  // Se aplică doar panoului de bord

    wp_enqueue_script( 'ajax-script', plugins_url( '/js/my_query.js', __FILE__ ), array('jquery'));

    // în javascript, proprietățile obiectului sunt accesate ca ajax_object.ajax_url, ajax_object.we_value
    wp_localize_script( 'ajax-script', 'ajax_object',
            array( 'ajax_url' => admin_url( 'admin-ajax.php' ), 'we_value' => 1234 ) );
}
3 aug. 2013 23:18:56
Comentarii

Mulțumesc pentru postarea detaliată. Sunt chiar destul de slab cu PHP și JavaScript, așa că, să fiu sincer, nu a prea avut sens pentru mine, chiar dacă explicația ta pare destul de amănunțită. Am reușit să o fac aproape să funcționeze - slideshow-ul se încarcă, dar are probleme. Ca și cum nu încarcă toate resursele necesare pentru a funcționa corect (imaginile nu au dimensiunea corectă, elementele care ar trebui să fie ascunse nu sunt, etc.). Am încercat să adaug manual JavaScript-ul și CSS-ul pluginului, dar fără succes.

Don't Wake Me Up Don't Wake Me Up
4 aug. 2013 12:05:40

Se pare că nu are legătură cu resursele - dacă încarc două versiuni ale slider-ului pe aceeași pagină, în acest fel și folosind shortcode-ul obișnuit pentru a mă asigura că toate resursele sunt încărcate, versiunea AJAX este totuși defectă.

Don't Wake Me Up Don't Wake Me Up
4 aug. 2013 12:10:40

Ca să fiu mai precis, versiunea AJAX afișează o grămadă de HTML în slide care nu apare în versiunea obișnuită cu shortcode. Acestea includ div-uri cu clasa thumbnail, delete slide, câmpuri de input pentru capturi, etc. - aproape ca și cum ar fi o versiune de administrare a slide-ului.

Don't Wake Me Up Don't Wake Me Up
4 aug. 2013 12:28:51

Dacă există o versiune "admin" a slideshow-ului și aceasta se încarcă, va trebui să localizați codul care controlează acest lucru. Presupun că ar încărca ceva diferit când is_admin() === true, dar toate cererile API AJAX sunt "admin".

s_ha_dum s_ha_dum
4 aug. 2013 18:43:55