एक खींचें और ड्रॉप jQuery यूआई Sortables सामने अंत लेआउट संपादक की स्थिति को बचाने के लिए कैसे?


20

मैं jQuery UI Sortable का उपयोग कर एक फ्रंट एंड पोस्ट लेआउट संपादक का निर्माण कर रहा हूं ।

एक पृष्ठभूमि छवि पर 250px बक्से द्वारा 300px में पदों को निर्धारित किया जाता है। वर्डप्रेस व्यवस्थापक का उपयोग करके पोस्ट बनाए और संपादित किए जाते हैं, लेकिन मैं साइटों के व्यवस्थापक को सामने के छोर पर एक ड्रैग और ड्रॉप इंटरफ़ेस का उपयोग करके बक्से के क्रम को समायोजित करने की अनुमति देना चाहता हूं।

मुझे ड्रैग और ड्रॉप सॉर्टेबल पार्ट काम कर रहा है, लेकिन बॉक्सेस की स्थिति (ऑर्डर) को बचाने के लिए एक तरह से आने की जरूरत है। आदर्श रूप में मैं एक विकल्प के रूप में राज्य को बचाने और क्वेरी में इसे बनाने में सक्षम होना चाहूंगा।

पदों के लिए क्वेरी एक साधारण WP_Query है जो अलग-अलग बॉक्स लेआउट को निर्धारित करने के लिए कस्टम मेटा बॉक्स से डेटा प्राप्त करता है ।:

$args= array(
      'meta_key' => 'c3m_shown_on',
       'meta_value'=> 'home' );
    $box_query = new WP_Query($args);  ?>
        <ul id="sortable">
            <?php
    while ($box_query->have_posts()) : $box_query->the_post(); global $post; global $prefix;           
    $box_size = c3m_get_field($prefix.'box_size', FALSE);
    $box_image = c3m_get_field($prefix.'post_box_image', FALSE);
    $overlay_class = c3m_get_field($prefix.'overlay_class', FALSE);

    if ( c3m_get_field($prefix.'external_link', FALSE) ) {
    $post_link = c3m_get_field($prefix.'external_link', FALSE);
    } else
            { $post_link = post_permalink(); 
    } ?>     
     <li class="<?php echo $box_size;?>  ui-state-default">
        <article <?php post_class() ?> id="post-<?php the_ID(); ?>">
            <?php echo  '<a href="'.$post_link.'" ><img src="'.esc_url($box_image).'" alt="Image via xxxxx.com" /></a>'; ?>
                <div class="post-box <?php echo $overlay_class;?>">
                <?php if ( c3m_get_field( $prefix.'text_display', FALSE) ) { ?>     
                <h2><a href="<?php echo $post_link?>"><?php the_title();?></a></h2> 
                <p><?php echo substr($post->post_excerpt, 0, 90) . '...'; ?></p>            
                <?php } ?>               
                </div>
         </article>
     </li>              
    <?php endwhile; ?>
       </ul>
</section>

जावास्क्रिप्ट केवल मूल डिफ़ॉल्ट सॉर्ट करने योग्य निर्देश है

jQuery(document).ready(function() {
    jQuery("#sortable").sortable();
  });

राज्य को बचाने के लिए कुकीज़ का उपयोग करने के तरीके उपलब्ध हैं , लेकिन मुझे गैर-व्यवस्थापक उपयोगकर्ताओं के लिए सॉर्टेबल ड्रैग और ड्रॉप को अक्षम करने की भी आवश्यकता है, इसलिए मुझे वास्तव में डेटाबेस को बचाने की आवश्यकता है।

मैं सबसे रचनात्मक और प्रयोग करने योग्य विधि की तलाश में हूं और सर्वश्रेष्ठ उत्तर के लिए 100 अंक का इनाम दूंगा।

अपडेट करें:

मुझे एक मामूली बदलाव के साथ काम करने का दैहिक उत्तर मिला ।

अजाक्सुरल गैर-व्यवस्थापक पृष्ठों पर मान वापस नहीं करता है, इसलिए मैंने wp_localize_script( 'functions', 'MyAjax', array( 'ajaxurl' => admin_url( 'admin-ajax.php' ) ) );मूल्य को परिभाषित करने के लिए उपयोग किया और जावास्क्रिप्ट लाइन को विकल्पों के तहत बदल दिया:
url: MyAjax.ajaxurl,

आदेश की व्यवस्था करने के लिए पहुंच को सीमित करने के लिए केवल मैंने अपने wp_enqueue_script फ़ंक्शन में एक सशर्त जोड़ा:

    function c3m_load_scripts() { 
    if ( current_user_can( 'edit_posts' ) ) {
        wp_enqueue_script( 'jquery-ui' );
        wp_enqueue_script( 'functions', get_bloginfo( 'stylesheet_directory' ) . '/_/js/functions.js', array( 'jquery', 'jquery-ui' ), false);
        wp_localize_script( 'functions', 'MyAjax', array( 'ajaxurl' => admin_url( 'admin-ajax.php' ) ) );
    }
}

मैं थोड़ा और परीक्षण करने जा रहा हूं और इस प्रश्न को हल किया और इनाम को पुरस्कार के रूप में चिह्नित किया।


1
क्या यह संभव है कि आप मेनू_ पोस्टों पर उपयोग कर सकते हैं? मुझे पता है कि आप उन्हें संलग्नक पर उपयोग कर सकते हैं तो पोस्ट क्यों नहीं? अगर यह संभव है तो यह है कि आप पदों के क्रम को कैसे स्टोर कर सकते हैं ...
ब्रैडी

1
लगता है कि आप कर सकते हैं - 'menu_order' - पृष्ठ क्रम द्वारा आदेश। पृष्ठों के लिए सबसे अधिक बार उपयोग किया जाता है (पृष्ठ में ऑर्डर फ़ील्ड संपादित करें बॉक्स में) और संलग्नक के लिए (सम्मिलित / अपलोड मीडिया गैलरी संवाद में पूर्णांक फ़ील्ड), लेकिन किसी भी पोस्ट प्रकार के लिए 'menu_order' मानों के साथ उपयोग किया जा सकता है (वे सभी डिफ़ॉल्ट हैं ०)।
ब्रैडी

@ ब्रैडी menu_order का उपयोग करने पर बहुत अच्छा विचार है। इस पर @somatic का विस्तार हुआ और इसने काम किया। धन्यवाद!
क्रिस_ओ

जवाबों:


21

ब्रैडी सही है कि menu_orderसंपत्ति का उपयोग करके कस्टम पोस्ट प्रकार के आदेशों को बचाने और प्रदर्शित करने का सबसे अच्छा तरीका है

यहां सूची को क्रमबद्ध बनाने और ajax के माध्यम से डेटा को वर्डप्रेस में भेजने के लिए jquery है:

jQuery(document).ready(function($) {        
    var itemList = $('#sortable');

    itemList.sortable({
        update: function(event, ui) {
            $('#loading-animation').show(); // Show the animate loading gif while waiting

            opts = {
                url: ajaxurl, // ajaxurl is defined by WordPress and points to /wp-admin/admin-ajax.php
                type: 'POST',
                async: true,
                cache: false,
                dataType: 'json',
                data:{
                    action: 'item_sort', // Tell WordPress how to handle this ajax request
                    order: itemList.sortable('toArray').toString() // Passes ID's of list items in  1,3,2 format
                },
                success: function(response) {
                    $('#loading-animation').hide(); // Hide the loading animation
                    return; 
                },
                error: function(xhr,textStatus,e) {  // This can be expanded to provide more information
                    alert(e);
                    // alert('There was an error saving the updates');
                    $('#loading-animation').hide(); // Hide the loading animation
                    return; 
                }
            };
            $.ajax(opts);
        }
    }); 
});

यहाँ Wordpress फ़ंक्शन है जो ajax कॉलबैक के लिए सुनता है और DB पर परिवर्तन करता है:

function my_save_item_order() {
    global $wpdb;

    $order = explode(',', $_POST['order']);
    $counter = 0;
    foreach ($order as $item_id) {
        $wpdb->update($wpdb->posts, array( 'menu_order' => $counter ), array( 'ID' => $item_id) );
        $counter++;
    }
    die(1);
}
add_action('wp_ajax_item_sort', 'my_save_item_order');
add_action('wp_ajax_nopriv_item_sort', 'my_save_item_order');

आपके द्वारा सहेजे गए क्रम में पदों को प्रदर्शित करने के लिए कुंजी menu_orderसंपत्ति को क्वेरी के साथ जोड़ना है :

$args= array(
    'meta_key' => 'c3m_shown_on',
    'meta_value'=> 'home'
    'orderby' => 'menu_order',
    'order' => 'ASC'
);

$box_query = new WP_Query($args);

फिर अपना लूप चलाएं और प्रत्येक आइटम को आउटपुट करें ... (पहली पंक्ति कोर wp लोडिंग एनीमेशन है - आप इसे शुरू में सीएसएस के माध्यम से छुपाना चाहेंगे, और फिर प्रसंस्करण के दौरान जक्वरी फ़ंक्शन प्रदर्शित करेगा)

<img src="<?php bloginfo('url'); ?>/wp-admin/images/loading.gif" id="loading-animation" />
<ul id="sortable">
    <li id="{echo post ID here}">{echo title or other name here}</li>
</ul>

आत्माओं के उत्कृष्ट ट्यूटोरियल से प्रेरित कोड ।


बहुत बढ़िया जवाब। मैं इसे एक शॉट दूँगा।
क्रिस_ओ

इसके लिए आपको बहुत धन्यवाद - कुछ ऐसी चीज़ों पर पूरी तरह से मदद की जो मैं भी काम कर रहा था। एक समस्या जिसका मुझे सामना करना पड़ा, वह यह था कि छांटने योग्य सूची में प्रत्येक आइटम के लिए एक आईडी होनी चाहिए जो पोस्ट आईडी से मेल खाती हो। यह स्पिरिज्ज़ल के ट्यूटोरियल में था, लेकिन ओपी के पद पर नहीं था।
डाल्टन

बिल्कुल सही, डाल्टन, मैं अपने उदाहरण में बहुत संक्षिप्त था। कोड अपडेट किया गया।
दैहिक

4

http://jsfiddle.net/TbR69/1/

समाप्त से दूर है, लेकिन विचार ड्रैग और ड्रॉप पर अजाक्स अनुरोध भेजने के लिए है। आप "सेव" बटन या कुछ और क्लिक करने के बाद ही ajax अनुरोध को ट्रिगर करना चाहते हैं। एक सरणी जिसमें पोस्ट आईडी और नया ऑर्डर भेजा जाएगा।

फिर आपको सर्वर के अंत में डेटाबेस में पदों को अपडेट करना होगा। अंत में, अपने लिए एक orderपैरामीटर जोड़ेंWP_Query लूप में ।

मुझे उम्मीद है कि यह आपको शुरू हो जाएगा। किसी को भी बेझिझक फ़िदा होना जारी रहता है।


0
/**
 *  Enqueue javascript and css files
 */
function uc_enqueue_my_assets() {
    wp_enqueue_script( 'jquery-ui-sortable');
    wp_register_script( 'order', plugins_url( '/js/order.js', __FILE__ ), array( 'jquery' ) );
    wp_enqueue_script( 'order' );
}

function uc_is_user_logged_in()
{
    if ( is_user_logged_in()) {
        add_action( 'wp_enqueue_scripts', 'uc_enqueue_my_assets' );
        add_action( 'admin_enqueue_scripts', 'uc_enqueue_my_assets' );
    }
}
add_action('init', 'uc_is_user_logged_in');


/**
 *  Update order of posts by ajax on trigger of drag and drop event
 */
function uc_sort_post_items() {

    $order = wp_parse_id_list(explode(',', $_POST['order']));
    write_log($order);

    global $wpdb;
    $list = join(', ', $order);
    $wpdb->query('SELECT @i:=0');
    $wpdb->query(
        "UPDATE wp_posts SET menu_order = ( @i:= @i+1 )
        WHERE ID IN ( $list ) ORDER BY FIELD( ID, $list );"
    );

    wp_die();
}
add_action('wp_ajax_uc_sort_post_items', 'uc_sort_post_items');
add_action('wp_ajax_nopriv_uc_sort_post_items', 'uc_sort_post_items');



/**
 *  Display sorted posts
 */
function uc_pre_get_posts( $wp_query ) {
    write_log(basename($_SERVER['PHP_SELF']));
    $wp_query->set('orderby', 'menu_order');
    $wp_query->set('order', 'ASC');
}
add_action( 'pre_get_posts', 'uc_pre_get_posts', 1 );

जावास्क्रिप्ट फ़ाइल order.js

$('#the-list').sortable({
        update: function(event, ui) {

            $.ajax({

                url: '/wp-admin/admin-ajax.php',
                type: 'post',
                dataType: 'json',
                data:{
                    action: 'uc_sort_post_items', // Tell WordPress how to handle this ajax request
                    order: '4567,4569,4565 ' // Passes ID's of list items in  1,3,2 format. Write your own js method to access the list of id from frontend.
                },
                success: function(data, response) {
                    console.log(response);
                },
                error: function(xhr,textStatus,e) {
                    alert(e);
                }

                });

        }
    });

कृपया कोड डंप न करें। आपसे कुछ स्पष्टीकरण जोड़ने का अनुरोध किया जाता है, क्यों लगता है कि उपरोक्त कोड प्रश्न का उत्तर देगा।
मयिनुल इस्लाम

@MayeenulIslam विवरण को टिप्पणी रेखा के रूप में कोड स्निपेट के अंदर पहले ही जोड़ दिया गया है।
स्काईरार
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.