Ajax ve WP

Zvolené téma obsahuje celkem 6 odpovědí. Do diskuze (3 účastníci) se naposledy zapojil uživatel  sjiamnocna a poslední změna je stará 8 let, 4 měsíce.

Aktuálně je na stránce zobrazeno 7 příspěvků - 1. až 7. (z celkem 7)
  • Autor
    Příspěvky
  • #25494

    Ada
    Participant

    Zdravím,

    řeším problém, že potřebuji dostat javascriptovou proměnnou do php. Ajaxový přenos se mi nějak nedaří – vyzkoušel jsem příklad z kodexu a na mých stránkách nefunguje. Můžete mi někdo poradit, kde dělám chybu? Mě už z toho šibe.

    PHP kód:

    add_action( 'wp_enqueue_scripts', 'my_enqueue' );
    function my_enqueue($hook) {
        if( 'index.php' != $hook ) {
    	// Only applies to dashboard panel
    	return;
        }
            
    	wp_enqueue_script( 'ajax-script', plugins_url( '/js/my_query.js', __FILE__ ), array('jquery') );
    
    	// in JavaScript, object properties are accessed as 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 ) );
    }
    
    // Same handler function...
    add_action( 'wp_ajax_my_action', 'my_action_callback' );
    add_action( 'wp_ajax_nopriv_my_action', 'my_action_callback' );
    
    function my_action_callback() {
    	global $wpdb;
    	$whatever = intval( $_POST['whatever'] );
    	//$whatever += 10;
      return $whatever;
    	wp_die();
    }
    
    if ( is_admin() ) {
        add_action( 'wp_ajax_my_frontend_action', 'my_frontend_action_callback' );
        add_action( 'wp_ajax_nopriv_my_frontend_action', 'my_frontend_action_callback' );
        add_action( 'wp_ajax_my_backend_action', 'my_backend_action_callback' );
        // Add other back-end action hooks here
    } else {
        // Add non-Ajax front-end action hooks here
    }
    
     // shortcode pro zobrazeni na strance
    add_shortcode( 'ajax-zkouska', 'my_action_callback' );

    JS script:

    jQuery(document).ready(function($) {
    	var data = {
    		'action': 'my_action',
    		'whatever': ajax_object.we_value      // We pass php values differently!
    	};
    	// We can also pass the url value separately from ajaxurl for front end AJAX implementations
    	jQuery.post(ajax_object.ajax_url, data, function(response) {
    		alert('Got this from the server: ' + response);
    	});
    });

    (v podstatě je opsaný WP codex příklad)

    A živý příklad jak mi to nefunguje je zde – LINK

    Předem díky za pomoc.

    #25532

    sjiamnocna
    Participant
    Web

    AJAX_OBJECT mi nikdy nefungoval, já úspěšně používám toto:

    $.post(ajaxurl, data, function(response) {
                jQuery('#xmlformat').html(response);
    	});

    Snad ti to pomůže :)

    #25543

    Ada
    Participant

    Dik za nasměrování – nějaky prostý příklad nemáš? Moc to neumím implementovat.

    #25547

    sjiamnocna
    Participant
    Web

    Načtu skript:
    wp_register_script('wpxml_script_ajaxxmlcont',$this->pluginfo['basefolder'].'/src/scripts/ajax_xmlcont.js',array('wpxml_script_jsfunctions'));

    Skript pro získání dat (používám JQuery, které se mi automaticky načítá díky zadání závislosti na jednom předešlém skriptu, který ji má “wpxml_script_jsfunctions”) – jde o načtení dat z XML souboru do formuláře:

    jQuery(document).ready(function($) {
        
        jQuery('#loadfile').click(function(){
           var data = {
                'action': 'wpxml_files',
                'plnamexmlbone_filename': jQuery('#selectfile').val()
    	};
            
            var title=jQuery(this).prev('.title').html();
            var id=jQuery(this).attr('id');
            
    	$.post(ajaxurl, data, function(response) {
                jQuery('#xmlformat').html(response);
    	});
        });
        
        jQuery('#postcount').on('change',function(){
            if (jQuery(this).val()<1 || jQuery(this).val()>499)alert();
            
        });
    });

    A nakonec akce AJAXu ve WP:

    class wpxml_ajax{
        
        public function wpxml_ajax(){
            
            $this->wpxml=new wpxml_feeder();
            $this->pluginfo=&$this->wpxml->pluginfo;
            
            add_action('wp_ajax_wpxml_files',array($this,'getfcont_xmlbones'));
        }
        public function getfcont_xmlbones(){
            $ffile=(file_exists($_POST['plnamexmlbone_filename']))?$_POST['plnamexmlbone_filename']:false;
            
            if($ffile) echo file_get_contents($ffile);
            else _e('Sorry, no such file was found. Maybe you\'ll have to use your own ideas to create own structure. I\'m sorry.',$this->pluginfo['langdomain']);
            
            die();
        }
    }
    $wpxml_ajax=new wpxml_ajax();

    Toto mi fungovalo, ale tento plugin už jsem asi zavrhl, protože sice byl asi tak 4x komplexnější, než ostatní pluginy tohoto typu dohromady (XML feed pro heureku ap.) ,ale myslím, že už jich je na trhu dost, aby si každý vybral podle chuti a já se radši budu věnovat svým unikátním pluginům (těžko věřit, ale opravdu jsou jediné – zatím) ;)

    #25548

    sjiamnocna
    Participant
    Web

    Ještě upozorním, že tím, že jsem tento plugin zavrhl, jsem se k němu už nevrátil, takže ani nezaznamenal konstruktory třídy pro PHP7 – tedy místo

    class cname{
    public function cname(){//...}
    }

    musíš (nebo pro kompatibilitu “měl bys” ;) ) použít

    class cname{
    public function __construct(){//...}
    }
    #25553

    admin
    Keymaster
    Web

    @ada: Zmiňovaný příklad nemůže fungovat, protože se na stránce vůbec nenačte Javascript. Podle uvedeného kódu by se tam měl načítat soubor my_query.js, ale nic podobného tam nevidím?

    A nechápu celou úvodní podmínku:

    if( 'index.php' != $hook ) {
      // Only applies to dashboard panel
      return;
    }

    K čemu to má být dobré? Omezujete použití skriptu pouze na Nástěnku? Potom ale musíte použít admin_enqueue_scripts pro administraci a nikoli wp_enqueue_scripts?

    #25554

    sjiamnocna
    Participant
    Web

    Jo, to by mohlo být… Díval jsem se na to z mobilu a PHP jsem nějak přeskočil

    Ještě dodám tak zpětně, že v tom mém příkladu (který snad funguje? možná) načítám skript do administrační části. Pro načtení do frontendu je potřeba místo admin_enqueue_scripts použít wp_enqueue_scripts

    V podstatě metoda pokus – omyl není špatná, ale je dobré si o omylech něco přečíst :D
    Já to neudělal a dodnes tápu :)

    ___________

    Pardon, po ránu mi to nějak nevychází :D
    Všechno už napsal admin, jen jsem skončil u posledního bloku kódu

Aktuálně je na stránce zobrazeno 7 příspěvků - 1. až 7. (z celkem 7)

Pokud chcete odpovědět na toto téma, musíte se nejdříve přihlásit.

WordPress – novinky, návody a zajímavosti