2016-08-22 9 views
8

एक वर्डप्रेस वेबसाइट में WooCommerce चल रहा है, उपयोगकर्ता अपने (डिफ़ॉल्ट) में प्रवेश कर सकते हैं व्यक्तिगत क्षेत्र और जैसे जानकारी प्रदर्शित:WooCommerce बी एस मॉडल में ग्राहक आदेश विस्तार

  • आदेश इतिहास
  • डाउनलोड
  • पतों
  • जानकारी
  • संपादित
  • लॉगआउट

orders टैब में, एक तालिका डिफ़ॉल्ट रूप से प्रस्तुत की जाती है, जिसमें सभी ऑर्डर की एक सूची दिखाती है, View बटन जो उस क्रम के पूर्ण विवरण पृष्ठ पर रीडायरेक्ट करता है।

जो मैं करने की कोशिश कर रहा हूं वह एक मॉडल विंडो में तालिका दृश्य दिखा रहा है।

मुझे इसमें लक्षित यूआरएल के साथ मोडल दिखाने में कोई समस्या नहीं है। वास्तविक समस्या यह है कि लक्षित यूआरएल पूर्ण पृष्ठ का है जो में दिख रहा है, और यह वही नहीं है जो मैं चाहता हूं।

मुझे लगता है कि केवल उस तालिका को लोड करने की अनुमति देने वाले कुछ शोर्ट हैं, या शायद कुछ woocommerce फ़ंक्शन load_order_content_by_id($id) जैसे हैं?

क्या कोई मुझे सही दिशा में इंगित कर सकता है?

धन्यवाद

=== === हल

Raunak गुप्ता के लिए धन्यवाद मुझे सही समारोह की ओर इशारा करते के लिए। मैं orders.php टेम्पलेट ओवरराइड, मॉडल खिड़की एचटीएमएल जोड़ा गया है और संपादित:

foreach ($actions as $key => $action) { 
    echo '<a href="' . esc_url($action['url']) . '" class="button ' . sanitize_html_class($key) . '"'; 
    if(isset($action['data']) && is_array($action['data'])){ 
     foreach($action['data'] AS $data_attr=>$data_value){ 
      echo 'data-' . sanitize_html_class($data_attr) .'="' .esc_html($data_value) . '" '; 
     } 
    } 
    echo '>' . esc_html($action['name']) . '</a>'; 
} 

एक छोटी सी जे एस

$('.woocommerce-MyAccount-orders .button.view').on('click', function(e){ 
    e.preventDefault(); 
    var data = {}; 
    data.action = 'modal_order'; 
    data.order_number = $(this).data('order-number'); 

    $.get(ajax_script.ajax_url, data, function(response) { 
     $('#modalOrderDetail').modal('show').find('.modal-body').html(response); 
    }); 
}); 

और वर्डप्रेस में झुका:

'view' => array(
    'url' => 'javascript:;', 
    'data' => [ 
     'order-number' => $order->get_order_number() 
    ], 
    'name' => __('View', 'woocommerce') 
), 

और एक ही फाइल पर function.php

function modal_order() { 
    if(is_user_logged_in()) { 
     $order_number = $_GET['order_number']; 
     woocommerce_order_details_table($order_number); 
    } 
} 

add_action('wp_ajax_modal_order', 'modal_order'); 
add_action('wp_ajax_nopriv_modal_order', 'modal_order'); 
+0

मुझे woocommerce नहीं पता, लेकिन आपका प्रश्न बहुत अस्पष्ट लगता है। अधिक जानकारी जोड़ने की कोशिश करें (शायद एक [https://jsfiddle.net/](https://jsfiddle.net/)) और आपको अधिक प्रतिक्रिया मिल सकती है। –

+0

अगर मैं इसमें वर्डप्रेस लोड करना संभव था तो मैं एक बेवकूफ़ बनाउंगा :) मैं अपनी पोस्ट – Yuri

+0

को स्पष्टीकरण देने की कोशिश करूंगा यदि कम से कम डाउनवॉटिंग की आवश्यकता महसूस होती है, तो कम से कम – Yuri

उत्तर

4

woocommerce_order_details_table($order_id)

यह WooCommerce समारोह से $order_id

+0

नाइस :) और मुझे लगता है कि यह टेम्पलेट इसका उपयोग करता है - 'ऑर्डर/ऑर्डर-विवरण.एचपीपी' विषय में अतिसंवेदनशील है, संरचना को आवश्यकतानुसार नहीं होना चाहिए। +1 –

+1

हां आप अपनी आवश्यकता के हिसाब से 'ऑर्डर/ऑर्डर-विवरण.एचपी',' ऑर्डर/ऑर्डर-विवरण-item.php' और 'ऑर्डर/ऑर्डर-विवरण-ग्राहक.एफ़पी' फाइलों को ओवरराइड कर सकते हैं। –

+0

मूल टेम्पलेट को ओवरराइड करने का एक हिस्सा, इसका उपयोग करने के लिए मुझे किस वैश्विक चर को शामिल करना चाहिए? – Yuri

2

ऐसा कोई भी कार्य नहीं है जिसे मैं जानता हूं कि आपको एक ही समय में आवश्यक सभी ऑर्डर विवरण मिल सकते हैं, हालांकि आपको अपनी आवश्यकता के अनुसार WC_Order कक्षा पर कॉल कर सकते हैं। इन तरह के कुछ कॉल विधियों को बनाने से आपको वह जानकारी मिल जाएगी जो आपको चाहिए। आपको आवश्यक सटीक जानकारी के आधार पर आपको केवल get_items() विधि से अधिक कॉल करने की आवश्यकता होगी। आम तौर पर वे वस्तुओं को पोस्ट करने के लिए संरचना में समान वस्तुओं को वापस करते हैं।

$order = new WC_Order($post->ID); 
$_order = $order->get_items(); 

यहाँ लुक 'विरासत में मिला तरीकों' अनुभाग के अंतर्गत तरीकों आप सभी अपनी आवश्यक जानकारी प्राप्त करने के लिए कॉल करने के लिए आवश्यकता हो सकती है खोजने के लिए।https://docs.woocommerce.com/wc-apidocs/class-WC_Order.html

4

HTML प्रपत्र में पूर्ण आदेश विवरण देता है यहाँ मोडल विंडो में curent ग्राहक आदेश प्रदर्शित करने के लिए पूरा कोड है। इसके

<?php 

if(is_user_logged_in()): 

    // The query 
    $args = array(
     // WC orders post type 
     'post_type' => 'shop_order', 
     'numberposts' => -1, 
     // for current user id 
     'meta_key' => '_customer_user', 
     'meta_value' => get_current_user_id(), 
     // get orders statuses 
     'post_status' => array_keys(wc_get_order_statuses()), 
    ); 

    // Get all customer orders 
    $customer_orders = get_posts($args); 
    $count_ord = 0; 
    if (!empty($customer_orders)) 
     foreach ($customer_orders as $custo_order) 
      $count_ord++; 

    if ($count_ord > 0) 
     $has_orders = true; 
    else 
     $has_orders = false; 

    // the template my-account/orders.php ?> 

    <?php do_action('woocommerce_before_account_orders', $has_orders); ?> 

    <?php if ($has_orders) : ?> 

    <table class="woocommerce-MyAccount-orders shop_table shop_table_responsive my_account_orders account-orders-table"> 
     <thead> 
      <tr> 
       <?php foreach (wc_get_account_orders_columns() as $column_id => $column_name) : ?> 
        <th class="<?php echo esc_attr($column_id); ?>"><span class="nobr"><?php echo esc_html($column_name); ?></span></th> 
       <?php endforeach; ?> 
      </tr> 
     </thead> 

     <tbody> 
      <?php foreach ($customer_orders as $customer_order) : 
       $order  = wc_get_order($customer_order); 
       $item_count = $order->get_item_count(); 
       ?> 
       <tr class="order"> 
        <?php foreach (wc_get_account_orders_columns() as $column_id => $column_name) : ?> 
         <td class="<?php echo esc_attr($column_id); ?>" data-title="<?php echo esc_attr($column_name); ?>"> 
          <?php if (has_action('woocommerce_my_account_my_orders_column_' . $column_id)) : ?> 
           <?php do_action('woocommerce_my_account_my_orders_column_' . $column_id, $order); ?> 

          <?php elseif ('order-number' === $column_id) : ?> 
           <a href="<?php echo esc_url($order->get_view_order_url()); ?>"> 
            <?php echo _x('#', 'hash before order number', 'woocommerce') . $order->get_order_number(); ?> 
           </a> 

          <?php elseif ('order-date' === $column_id) : ?> 
           <time datetime="<?php echo date('Y-m-d', strtotime($order->order_date)); ?>" title="<?php echo esc_attr(strtotime($order->order_date)); ?>"><?php echo date_i18n(get_option('date_format'), strtotime($order->order_date)); ?></time> 

          <?php elseif ('order-status' === $column_id) : ?> 
           <?php echo wc_get_order_status_name($order->get_status()); ?> 

          <?php elseif ('order-total' === $column_id) : ?> 
           <?php echo sprintf(_n('%s for %s item', '%s for %s items', $item_count, 'woocommerce'), $order->get_formatted_order_total(), $item_count); ?> 

          <?php elseif ('order-actions' === $column_id) : ?> 
           <?php 
            $actions = array(
             'pay' => array(
              'url' => $order->get_checkout_payment_url(), 
              'name' => __('Pay', 'woocommerce') 
             ), 
             'view' => array(
              'url' => $order->get_view_order_url(), 
              'name' => __('View', 'woocommerce') 
             ), 
             'cancel' => array(
              'url' => $order->get_cancel_order_url(wc_get_page_permalink('myaccount')), 
              'name' => __('Cancel', 'woocommerce') 
             ) 
            ); 

            if (! $order->needs_payment()) { 
             unset($actions['pay']); 
            } 

            if (! in_array($order->get_status(), apply_filters('woocommerce_valid_order_statuses_for_cancel', array('pending', 'failed'), $order))) { 
             unset($actions['cancel']); 
            } 

            if ($actions = apply_filters('woocommerce_my_account_my_orders_actions', $actions, $order)) { 
             foreach ($actions as $key => $action) { 
              echo '<a href="' . esc_url($action['url']) . '" class="button ' . sanitize_html_class($key) . '">' . esc_html($action['name']) . '</a>'; 
             } 
            } 
           ?> 
          <?php endif; ?> 
         </td> 
        <?php endforeach; ?> 
       </tr> 
      <?php endforeach; ?> 
     </tbody> 
    </table> 

    <?php do_action('woocommerce_before_account_orders_pagination'); ?> 

    <?php if (1 < $customer_orders->max_num_pages) : ?> 
     <div class="woocommerce-Pagination"> 
      <?php if (1 !== $current_page) : ?> 
       <a class="woocommerce-Button woocommerce-Button--previous button" href="<?php echo esc_url(wc_get_endpoint_url('orders', $current_page - 1)); ?>"><?php _e('Previous', 'woocommerce'); ?></a> 
      <?php endif; ?> 

      <?php if ($current_page !== intval($customer_orders->max_num_pages)) : ?> 
       <a class="woocommerce-Button woocommerce-Button--next button" href="<?php echo esc_url(wc_get_endpoint_url('orders', $current_page + 1)); ?>"><?php _e('Next', 'woocommerce'); ?></a> 
      <?php endif; ?> 
     </div> 
    <?php endif; ?> 

<?php else : ?> 
    <div class="woocommerce-Message woocommerce-Message--info woocommerce-info"> 
     <a class="woocommerce-Button button" href="<?php echo esc_url(apply_filters('woocommerce_return_to_shop_redirect', wc_get_page_permalink('shop'))); ?>"> 
      <?php _e('Go Shop', 'woocommerce') ?> 
     </a> 
<?php endif; ?> 
     <?php _e('No order has been made yet.', 'woocommerce'); ?> 
    </div> 

<?php do_action('woocommerce_after_account_orders', $has_orders); ?> 

<?php endif; ?> 

एक क्लासिक क्वेरी पर वर्तमान उपयोगकर्ता आदेश प्राप्त करने के लिए और my-account/orders.php(हल्के से अनुकूलित) टेम्पलेट पर ... आधारित आप अपने मोडल विंडो को मौजूदा सीएसएस नियम जोड़ने और/या कि सीएसएस अनुकूलित करना होगा नियम।

यह कोड परीक्षण और पूरी तरह कार्यात्मक है।

+0

उत्तर के लिए धन्यवाद, लेकिन 'woocommerce_order_details_table ($ order_id)' के साथ मैं कोड की कुछ पंक्तियों के साथ वांछित परिणाम प्राप्त करने में सक्षम था। – Yuri

+0

@Yuri जैसा कि आपने वास्तव में इसका उल्लेख नहीं किया है, मेरे पास इस पर काम है, यह वर्तमान ग्राहक आदेशों के लिए woocommerce टेम्पलेट है, पेजिंग और सबकुछ के साथ, जैसे "मेरा खाता" => "ऑर्डर" (लेकिन नेविगेशन के बिना, मेनू और वह सब कुछ जो आप नहीं चाहते हैं) ... यह एक पूर्ण कुंजी मोड़ समाधान (वैकल्पिक) है। – LoicTheAztec

+0

मैं सिर्फ एक ऑर्डर टेबल को मॉडल विंडो पर दिखाना चाहता था, पूर्ण ऑर्डर सूची नहीं। – Yuri

संबंधित मुद्दे