Kısa kodda AJAX kullanın


9

Ben rasgele bir teklif görüntülemek için kısa kod için aşağıdaki kodu var. Soru: nasıl bir düğme ekran yeni bir rastgele alıntı yapmak? Demek istediğim, bu düğmeye basacak ve size yeni bir teklif gösterecektir (elbette sayfayı yenilemeden).

function random_quote() {

    // quotes file
     $array = file("/path to txt file");

    // generate a random number between 0 and the total count of $array minus 1
    // we minus 1 from the total quotes because array indices start at 0 rather than 1 by default
    $r = rand(0,count($array)-1);

    // return the quote in the array with an indices of $r - our random number
    return $array[rand(0,count($array)-1)];
}

add_shortcode( 'randomquotes', 'random_quote');

WordPress'de ajax kullanarak sayfadaki içeriği nasıl güncelleyebileceğinizle ilgileniyorum? Benim durumumda, çünkü aslında tam olarak bu.

Kötü İngilizcem için özür dilerim. Umarım beni anlıyorsun. Teşekkürler!

Yanıtlar:


4

Öncelikle, bu WPSE kapsamında çok sınırda , hiç de değil.
İlk HTML çıkışını tetikleyen kısa kodun yanı sıra, bu gerçekten sadece AJAX.

Her neyse, bu söyleniyor, böyle yapılır:

PHP

Sağladığınız yukarıdaki PHP snippet'inin işlevsel olduğunu varsayarsak, aşağıdakileri ajax çağrısı için bir php dosyasına yerleştirin:

/wp-content/themes/%your_theme%/js/ajax-load-quote.php

 <?php
 /* uncomment the below, if you want to use native WP functions in this file */
// require_once('../../../../wp-load.php');

 $array = file( $_POST['file_path'] ); // file path in $_POST, as from the js
 $r = rand( 0, count($array) - 1 );

 return '<p>' . $array[$r] . '</p>';
 ?>

İleride başvurmak ve bu yanıtı başkalarına faydalı wp-load.phphale getirmek için: Yerel WordPress işlevinden yararlanmak için dahil edilmesi gerektiğini unutmayın . En commom durum muhtemelen ihtiyacı ya olmanın WP_Queryya $wpdb.

HTML Yapısı

Sayfa içeriğinde, widget'ta veya şablon dosyasında:

<div id="randomquotes">
    <p>I would rather have my ignorance than another man’s knowledge,
       because I have so much more of it.<br />
       -- Mark Twain, American author & Playwright</p>
</div>
<a id="newquote" class="button" href="#" title="Gimme a new one!">New Quote</a>

Bunu açıkça beğeninize göre ayarlayabilirsiniz, ancak bu örnek uğruna, bununla devam ediyoruz.
Yukarıdakileri daha sonra bir kısa kod yoluyla oluşturacağız.

JQuery

/wp-content/themes/%your_theme%/js/ajax-load-quote.js

function ajaxQuote() {
    var theQuote = jQuery.ajax({
        type: 'POST',
        url: ajaxParams.themeURI+'js/ajax-load-quote.php',
        /* supplying the file path to the ajax loaded php as a $_POST variable */
        data: { file_path: ajaxParams.filePath },
        beforeSend: function() {
            ajaxLoadingScreen(true,'#randomquotes');
        },
        success: function(data) {
            jQuery('#randomquotes').find('p').remove();
            jQuery('#randomquotes').prepend(data);
        },
        complete: function() {
            ajaxLoadingScreen(false,'#randomquotes');
        }
    });
    return theQuote;
}
/* Loading screen to be displayed during the process, optional */
function ajaxLoadingScreen(switchOn,element) {
    /* show loading screen */
    if (switchOn) {
        jQuery(''+element).css({
            'position': 'relative'
        });
        var appendHTML = '<div class="ajax-loading-screen appended">
            <img src="'+ajaxParams.themeURI+'images/ajax-loader.gif"
                alt="Loading ..." width="16" height="16" /></div>';
        if( jQuery(''+element).children('.ajax-loading-screen').length === 0 ) {
            jQuery(''+element).append(appendHTML);
        }
        jQuery(''+element).children('.ajax-loading-screen').first().css({
            'display': 'block',
            'visibility': 'visible',
            'filter': 'alpha(opacity=100)',
            '-ms-filter': '"progid:DXImageTransform.Microsoft.Alpha(Opacity=100)"',
            'opacity': '1'
        });
    } else {
        /* hide the loading screen */
        jQuery(''+element).children('.ajax-loading-screen').css({
            'display': '',
            'visibility': '',
            'filter': '',
            '-ms-filter': '',
            'opacity': ''
        });
        jQuery(''+element).css({
            'position': ''
        });
    }
}
/* triggering the above via the click event */
jQuery('#newquotes').click( function() {
    var theQuote = ajaxQuote();
    return false;
});

Function.php içinde bir araya getirmek

Yukarıdaki snippet'inizin altına (aşağıda değiştirilmiş olarak dahil olduğunu göreceksiniz) aşağıdakileri yapıştırın:

function random_quote( $atts ) {
    /* extracts the value of shortcode argument path */
    extract( shortcode_atts( array(
        'path' => get_template_directory_uri() . '/quotes.txt' // default, if not set
    ), $atts ) );
    $array = file( $path );
    $r = rand( 0, count($array) - 1 );
    $output = '<div id="randomquotes">' .
            '<p>' . $array[$r] . '</p>' .
        '</div>' .
        '<a id="newquote" class="button" href="#" title="Gimme a new one!">New Quote</a>';
    /* enqueue the below registered script, if needed */
    wp_enqueue_script( 'ajax-quote' );
    /* supplying the file path to the script */
    wp_localize_script(
        'ajax-quote',
        'ajaxParams',
        array(
            'filePath' => $path,
            'themeURI' => get_template_directory_uri() . '/'
        )
    );
    return $output;
}
add_shortcode( 'randomquotes', 'random_quote');
/* register the js */
function wpse72974_load_scripts() {
    if ( ! is_admin() ) {
        wp_register_script(
           'ajax-quote', 
            get_template_directory_uri() . '/js/ajax-load-quote.js',
            array( 'jquery' ),
            '1.0',
            true
        );
    }
}
add_action ( 'init', 'wpse72974_load_scripts' );

İsteğe bağlı: Yükleme ekranı için css

.ajax-loading-screen {
    display: none;
    visibility: hidden;
    position: absolute;
    top: 0;
    right: 0;
    bottom: 0;
    left: 0;
    width: 100%;
    background: #ffffff; /* the background of your site or the container of the quote */
    filter: alpha(opacity=0);
    -ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=0)";
    opacity: 0;
    -webkit-transition:  opacity .1s;
    -moz-transition:  opacity .1s;
    -ms-transition:  opacity .1s;
    -o-transition: opacity .1s;
    transition: opacity .1s;
    z-index: 9999;
}
.ajax-loading-screen img {
    position: absolute;
    top: 50%;
    left: 50%;
    margin: -8px 0 0 -8px;
}

Kaynaklar / Okuma


1
Yerleşik AJAX API'sını kullanmamanız için herhangi bir neden var mı?
fuxia

@toscho Dürüst olmak gerekirse - çok aşina değil. Okumaya değer mi?
Johannes Pille

Evet kesinlikle. :) Bir alternatif ekleyeceğim.
fuxia

Mükemmel! Teşekkür ederim! <br/> İşlev bağımsız değişkenini ayarlarsanız bir komut dosyası çalışır mı? Örneğin, bir metin dosyasına bağlantı sağlamak için kısa kodda olmak? <br/> function random_quote ($path) {      $ array = file ("$ path");<br/> ... [randomquote file = "http://exampe.com/file.txt"]<br/> Peki işe yarayacak mı? Programlama konusunda çok bilgili değilim.
user23769

Cevabı güncelledim. Artık kısa kod tarafından ayarlanan [randomquotes path="path/to/file.txt"], js'ye ve oradan php betiğine aktarılan bir dosyayolu içerir .
Johannes Pille

7

Bir komut dosyasını kısa kodda kaydedebilirsiniz. Temanın içerdiği düşünüldüğünde altbilgiye yazdırılacaktır wp_footer().

Nasıl çalışır:

  1. İle kısa kod geri aramasını kaydedin add_shortcode().
  2. Kısa kod geri aramasında komut dosyasını kaydedin ve ardından çıktıyı döndürün.
  3. Komut dosyasına bir güncelleme düğmesi ekleyin, bir POST isteği gönderin admin_url( 'admin-ajax.php' )ve yeni verileri alın. Döndürülen verileri kısa kodlu öğeye ekleyin.

İşte bunu yapan örnek bir komut dosyası. İki dosya: bir PHP sınıfı ve bir JavaScript dosyası. Her ikisi de, örneğin, aynı dizinde oturmalıdır ajax-shortcode-demo.

ajax-shortcode-demo.php

<?php
/**
 * Plugin Name: AJAX Shortcode Demo
 * Description: How to use AJAX from a shortcode handler named <code>[ajaxdemo]</code>.
 */

add_action( 'wp_loaded', array ( 'Ajax_Shortcode_Demo', 'get_instance' ) );

class Ajax_Shortcode_Demo
{
    /**
     * Current plugin instance
     *
     * @type NULL|object
     */
    protected static $instance = NULL;

    /**
     * Unique action name to trigger our callback
     *
     * @type string
     */
    protected $ajax_action = 'load_demo_data';

    /**
     * CSS class for the shortcode, reused as JavaScript handle.
     *
     * Must be unique too.
     *
     * @type string
     */
    protected $shortcode_class = 'ajaxdemo';

    /**
     * Remeber if we had regsitered a script on a page already.
     *
     * @type boolean
     */
    protected $script_registered = FALSE;

    /**
     * Create a new instance.
     *
     * @wp-hook wp_loaded
     * @return  object $this
     */
    public static function get_instance()
    {
        NULL === self::$instance and self::$instance = new self;
        return self::$instance;
    }

    /**
     * Constructor. Register shortcode and AJAX callback handlers.
     */
    public function __construct()
    {
        add_shortcode( 'ajaxdemo', array ( $this, 'shortcode_handler' ) );

        // register the AJAX callback
        $callback = array ( $this, 'ajax_callback' );
        // user who are logged in
        add_action( "wp_ajax_$this->ajax_action", $callback );
        // anonymous users
        add_action( "wp_ajax_nopriv_$this->ajax_action", $callback );
    }

    /**
     * Render the shortcode.
     */
    public function shortcode_handler()
    {
        $this->register_scripts();

        return sprintf(
            '<div class="%1$s"><b>%2$s</b></div>',
            $this->shortcode_class,
            $this->get_rand()
        );
    }

    /**
     * Return AJAX result.
     *
     * Must 'echo' and 'die'.
     *
     * @wp-hook wp_ajax_$this->ajax_action
     * @wp-hook wp_ajax_nopriv_$this->ajax_action
     * @return int
     */
    public function ajax_callback()
    {
        echo $this->get_rand();
        exit;
    }

    /**
     * Random number.
     *
     * @return int
     */
    protected function get_rand()
    {
        return rand( 1, 1000 );
    }

    /**
     * Register script and global data object.
     *
     * The data will be printent before the linked script.
     */
    protected function register_scripts()
    {
        if ( $this->script_registered )
            return;

        $this->script_registered = TRUE;

        wp_register_script(
            // unique handle
            $this->shortcode_class,
            // script URL
            plugin_dir_url( __FILE__ ) . '/jquery-ajax-demo.js',
            // dependencies
            array ( 'jquery'),
            // version
            'v1',
            // print in footer
            TRUE
        );

        wp_enqueue_script( $this->shortcode_class );

        $data = array (
            // URL address for AJAX request
            'ajaxUrl'   => admin_url( 'admin-ajax.php' ),
            // action to trigger our callback
            'action'    => $this->ajax_action,
            // selector for jQuery
            'democlass' => $this->shortcode_class
        );

        wp_localize_script( $this->shortcode_class, 'AjaxDemo', $data );
    }
}

jquery-ajax-demo.js

jQuery( function( $ ) {

    var buttonClass = AjaxDemo.democlass + 'Button',
        // insert AJAX result into the shortcode element
        updateDemo = function( response ){          
            $( '.' + AjaxDemo.democlass ).find( 'b' ).html( response );
        },
        // fetch AJAX data
        loadDemo = function() {
            $.post( AjaxDemo.ajaxUrl, { action: AjaxDemo.action }, updateDemo );
        };

    // add an update button
    $( '.' + AjaxDemo.democlass )
        .append( ' <button class="' + buttonClass + '">New</button>' );

    // assign the clock handler to the button
    $( '.' + buttonClass ).click( loadDemo );
});

Bir blog gönderisinde sonuç:

resim açıklamasını buraya girin


+1 ve Yukarıdakiler için teşekkürler. Kesinlikle okumaya değer görünüyor. Sanırım yukarıda olanların çoğunu alıyorum, kodeks sayfaları okuma gündemimde ve muhtemelen kaynağı yine de kontrol edeceğim. Yine de, 2 hızlı takip sorusunu yanıtlamama izin verin: API'yi kullanmanın programcı için (temiz, özlü, çevreye bağlı (yani WP)) benim için avantajlı olacağını görebiliyorum. 1. performans hakkında Nasıl? Doğrudan jQuery kullanımı ile karşılaştırıldığında herhangi bir kazanç veya dezavantaj (düz js performans farkının farkında mıyım)? 2. Esnek mi? Yani aynı geri aramaları ve argümanları kullanabilir miyim?
Johannes Pille

@JohannesPille Performans mükemmel değil . Öte yandan, şimdi tahmin edilebilir bir ortamda hareket edersiniz, diğer eklentiler kodunuzu (kancalar, işlevler) yeniden kullanabilir ve WP'nin nereye yüklendiğini bilmek zorunda değilsiniz (eklenti dizini / URL'si farklı olabilir) sunucu). Bunun yanı sıra özel bir çözüm gibi aynı.
fuxia

Ben etkinleştirildiğinde @toscho define('WP_DEBUG', true);benim wp-config.php bu çözüm bir hata oluşturulur: Strict Standards: call_user_func_array() expects parameter 1 to be a valid callback, non-static method Ajax_Shortcode_Demo::get_instance() should not be called statically in /var/www/.../public_html/wp-includes/plugin.php on line 496. Bu kritik mi? Biraz değiştirdim: wordpress.stackexchange.com/q/196332/25187
Iurie Malai

1
@Iurie Evet, bu yöntem olarak ilan edilmelidir static. Bunun için yayınımda bir düzenleme yaptım. Uyarı için teşekkürler. Artık böyle kod yazmazdım. :)
fuxia
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.