শর্টকোডে এজেএক্স ব্যবহার করুন


9

আমার কাছে একটি এলোমেলো উদ্ধৃতি প্রদর্শনের জন্য শর্টকোডে নীচের কোড রয়েছে। প্রশ্ন: কিভাবে একটি বোতাম একটি নতুন এলোমেলো উদ্ধৃতি প্রদর্শিত? মানে, এটি বোতামটি হিট করবে এবং আপনাকে একটি নতুন উক্তিটি দেখাবে (অবশ্যই পৃষ্ঠাটি রিফ্রেশ না করে)।

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

আমি কীভাবে আপনি ওয়ার্ডপ্রেসে অ্যাজাক্স ব্যবহার করে পৃষ্ঠায় থাকা সামগ্রীটি আপডেট করতে পারবেন তাতে আমি আগ্রহী? আমার পরিস্থিতিতে, কারণ বাস্তবে ঠিক সেটাই হবে।

আমার অদক্ষ ইংরেজির জন্য আমি দুঃখিত. আশা করি আপনি আমাকে বুঝতে পেরেছেন ধন্যবাদ!

উত্তর:


4

প্রথমত , এটি ডাব্লুপিএসইয়ের ক্ষেত্রের মধ্যে খুব সীমান্তরেখা , এটি মোটেই না।
প্রাথমিক এইচটিএমএল আউটপুট ট্রিগার করতে শর্টকোড ছাড়াও এটি সত্যই কেবল এজেএক্স।

যাইহোক, বলা হচ্ছে, এটি এভাবেই হয়:

পিএইচপি

ধরে নিলাম যে আপনি সরবরাহ করেছেন উপরের পিএইচপি স্নিপেটটি কার্যকরী, এজ্যাক্স কলের জন্য নিম্নলিখিতগুলি পিএইচপি ফাইলে রাখুন:

/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>';
 ?>

ভবিষ্যতের রেফারেন্সের জন্য এবং যাতে এই উত্তরটি অন্যদের কাছে দরকারী করে তোলে: দ্রষ্টব্য যে wp-load.phpস্থানীয় ওয়ার্ডপ্রেস কার্যকারিতা ব্যবহার করার জন্য অবশ্যই এতে অন্তর্ভুক্ত থাকতে হবে। সর্বাধিক কমোয়াস ক্ষেত্রে সম্ভবত প্রয়োজন হয় WP_Queryবা হয় $wpdb

এইচটিএমএল স্ট্রাকচার

পৃষ্ঠার সামগ্রীতে, একটি উইজেট বা একটি টেম্পলেট ফাইল:

<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>

এটি আপনি স্পষ্টতই আপনার পছন্দ অনুসারে সামঞ্জস্য করতে পারেন তবে এই উদাহরণের স্বার্থে এটি আমরা যাচ্ছি।
আমরা পরে একটি শর্টকোডের মাধ্যমে উপরেরটি তৈরি করব।

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

একসঙ্গে এটি নির্বাণ থিমের functions.php

আপনার উপরের স্নিপেটের নীচে (যা আপনি নীচে সংশোধিত অন্তর্ভুক্ত দেখতে পাবেন), নিম্নলিখিতটি পেস্ট করুন:

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

Alচ্ছিক: লোডিং স্ক্রিনের জন্য সিএসএস

.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;
}

সংস্থান / পঠন


1
অন্তর্নির্মিত এজ্যাক্স এপিআই ব্যবহার না করার কোনও কারণ?
ফুসিয়া

@ টসচো সত্যই - এটির সাথে খুব বেশি পরিচিত নয়। একটি পড়া মূল্যবান?
জোহানেস পিল

হ্যাঁ একেবারে. :) আমি একটি বিকল্প যুক্ত করব।
ফুসিয়া

পারফেক্ট! আপনাকে ধন্যবাদ! <br/> কোনও স্ক্রিপ্ট কাজ করবে, যদি আপনি ফাংশনের যুক্তিটি সেট করেন? উদাহরণস্বরূপ, কোনও পাঠ্য ফাইলের লিঙ্ক সরবরাহ করতে শর্টকেডে থাকতে হবে? <br/> function random_quote ($path) {      $ array = file ("$ path");<br/> ... [randomquote file = "http://exampe.com/file.txt"]<br/> তাহলে এটি কি কাজ করবে? আমি প্রোগ্রামিংয়ে খুব পারদর্শী নই।
ব্যবহারকারী 23769

আমি উত্তর আপডেট করেছি। এটিতে এখন একটি ফাইলপথ শর্টকোড দ্বারা সেট করা রয়েছে [randomquotes path="path/to/file.txt"], জেএসে এবং সেখান থেকে পিএইচপি স্ক্রিপ্টে চলে গেছে।
জোহানেস পিল

7

আপনি একটি শর্টকোডে একটি স্ক্রিপ্ট নিবন্ধন করতে পারেন। এটা তোলে ফুটার মধ্যে প্রিন্ট করা হবে, দেওয়া থিম রয়েছে wp_footer()

কিভাবে এটা কাজ করে:

  1. এর সাথে শর্টকোড কলব্যাকটি নিবন্ধন করুন add_shortcode()
  2. শর্টকোড কলব্যাকে, স্ক্রিপ্টটি নিবন্ধ করুন, তারপরে আউটপুট ফিরিয়ে দিন।
  3. স্ক্রিপ্টে একটি আপডেট বোতাম যুক্ত করুন, একটি POST অনুরোধ প্রেরণ করুন admin_url( 'admin-ajax.php' )এবং নতুন ডেটা আনুন। শর্টকোড দিয়ে উপাদানটিতে ফিরে আসা ডেটা .োকান।

এখানে এটি করার একটি নমুনা স্ক্রিপ্ট। দুটি ফাইল: একটি পিএইচপি ক্লাস এবং একটি জাভাস্ক্রিপ্ট ফাইল। উদাহরণস্বরূপ, উভয়ের একই ডিরেক্টরিতে বসতে হবে 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 );
});

একটি ব্লগ পোস্টে ফলাফল:

এখানে চিত্র বর্ণনা লিখুন


+1 এবং উপরের জন্য ধন্যবাদ। পড়তে অবশ্যই মূল্যবান মনে হচ্ছে। আমি মনে করি উপরে যা চলছে তার বেশিরভাগটিই পেয়েছি, কোডেক্স পৃষ্ঠাগুলি আমার পড়ার এজেন্ডায় রয়েছে এবং আমি সম্ভবত উত্সটি চেক করব will তবুও, আমাকে তাত্ক্ষণিকভাবে 2 টি ফলো-আপ প্রশ্নগুলির উত্তর দেওয়ার অনুমতি দিন: আমি দেখতে পাচ্ছি যে এপিআই ব্যবহার করা আমার পক্ষে সুবিধাজনক হবে, প্রোগ্রামার (পরিষ্কার, সংক্ষিপ্ত, পরিবেশের সাথে আবদ্ধ (অর্থাত্ ডাব্লুপি))। 1. কর্মক্ষমতা সম্পর্কে? সরাসরি jQuery ব্যবহারের তুলনায় কোনও লাভ বা অসুবিধাগুলি (সরাসরি জেএস থেকে পারফরম্যান্স ফাঁক সম্পর্কে সচেতন)? 2. এটি কি নমনীয়? আমি কি একই কলব্যাক এবং তর্কগুলি ব্যবহার করতে পারি?
জোহানেস পিল

@ জোহানেসপিল পারফরম্যান্স নিখুঁত নয় । অন্যদিকে, আপনি এখন অনুমানযোগ্য পরিবেশে কাজ করেন, অন্য প্লাগইনগুলি আপনার কোডটি (হুকস, ফাংশন) পুনরায় ব্যবহার করতে পারে এবং ডাব্লুপি কোথায় ইনস্টল করা আছে তা আপনাকে জানতে হবে না (প্লাগইন ডিরেক্টরি / ইউআরএল অন্যরকম হতে পারে) সার্ভার)। এছাড়াও এটি কাস্টম সমাধানের মতো।
ফুসিয়া

@toscho যখন আমি সক্রিয় define('WP_DEBUG', true);আমার WP-config.php মধ্যে এই সমাধান একটি ত্রুটি উৎপন্ন: 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। এটা কি সমালোচনা? আমি এটিকে কিছুটা পরিবর্তন করেছি: wordpress.stackexchange.com/q/196332/25187
আইউরি মালাই

1
@ ইউরি হ্যাঁ, সেই পদ্ধতিটি হিসাবে ঘোষণা করতে হবে static। আমি তার জন্য আমার পোস্টে একটি সম্পাদনা করেছি। নোটিশের জন্য ধন্যবাদ। আমি আর কোড লিখব না। :)
ফুসিয়া
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.