13

Próbuję wyświetlić pola, które utworzyłem w szablonie ostatnich zamówień WooCommerce i nie mam zbyt dużej wiedzy w PHP.Wyświetlaj typ wpisu produktu zaawansowane pole niestandardowe na szablonie ostatnich zamówień i zamówieniach administracyjnych (woocommerce)

Utworzono pole o nazwie sesje i zarejestrowano jako typ wpisu produktu. Gdy użytkownik kupi produkt, chcę, aby pola celne "sesje" były wyświetlane na Moje konto> Ostatnie zamówienia (szablon).

Próbowałem szukać odpowiedzi i rozwiązań i wydaje mi się, że utknąłem.

Oto dostosowany kod szablonu my-order.php, nad którym pracowałem. Hackowałem to od wielu dni i nie mogę wyświetlać tych wartości w tabeli ostatnich zamówień.

Updated - dodał obrazów na więcej opisu do wyjaśnienia mój problem

1.) Jak widać tutaj stworzyłem dwa rodzaje pól i zarejestrował je jako produktów typu postu

enter image description here

2.) Potem umieszcza wartość tych dwóch pól Stworzyłem

enter image description here

3.) Gdy użytkownik lub zakupu klienta pozycja/produktu/pakietu. Chcę te dwie wartości, które zostaną pokazane na ostatnich rzędów użytkownika my-konta szablonu pod „Sessions” kolumna

enter image description here

if (! defined('ABSPATH')) { 
    exit; 
} 

$my_orders_columns = apply_filters('woocommerce_my_account_my_orders_columns', array(
    'order-number' => __('Package', 'woocommerce'), 
    'sessions'  => __('Session', 'woocommerce'), 
    'order-total' => __('Package Prize', 'woocommerce'), 
    'order-date'  => __('Date', 'woocommerce'), 
    'order-end-date' => __('End Date', 'woocommerce'), 
    'order-status' => __('Status', 'woocommerce'), 
    'order-actions' => ' ', 
)); 

$customer_orders = get_posts(apply_filters('woocommerce_my_account_my_orders_query', array(
    'numberposts' => $order_count, 
    'meta_key' => '_customer_user', 
    'meta_value' => get_current_user_id(), 
    'post_type' => wc_get_order_types('view-orders'), 
    'post_status' => array_keys(wc_get_order_statuses()) 
))); 

if ($customer_orders) : ?> 

    <h2><?php // echo apply_filters('woocommerce_my_account_my_orders_title', __('Recent Orders', 'woocommerce')); ?></h2> 

    <table class="shop_table shop_table_responsive my_account_orders"> 

     <thead> 
      <tr> 
       <?php foreach ($my_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 ($my_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) : ?> 
           <?php foreach($order->get_items() as $item) { 
            $product_name = $item['name']; 

           } ?> 

           <?php echo $product_name;?> 

          <?php elseif ('session' === $column_id) : ?> 
           <?php if (get_field('session_period', $product->id)) : ?> 



          <?php endif; ?> 


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

          <?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 /* Order End Date */ ?> 
          <?php elseif ('order-end-date' === $column_id) : ?> 
           <?php if (get_field('date_ended', $order->id)) : ?> 
           <p class="sendungsnummer"><?php the_field('date_ended', $order->id); ?> 

          <?php endif; ?> 

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


          <?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']); 
            } 

            /* -------- View Button -------- 
            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 endif; ?> 
+0

Tak, pokazany na szablonie strony lub na stronie produktu – clestcruz

+0

Tak, są one zawarte na wszystkich indywidualnych stronach dotyczących dumności. – clestcruz

+0

Hmmm spróbuje używam wtyczki o nazwie "zaawansowane pola niestandardowe" w moim projekcie. – clestcruz

Odpowiedz

16

Tutaj będziemy na innym podejściu niż pól niestandardowych wykonane z wtyczką ACF. Tworzymy dedykowane METABOX z 2 pól wewnątrz niej, znajdujących się na prawej kolumnie bocznej na stronach produktów backend, z tym kodem:

// 
//Adding Meta container admin product pages 
// 
add_action('add_meta_boxes', 'cc_add_meta_boxes'); 
if (! function_exists('cc_add_meta_boxes')) 
{ 
    function cc_add_meta_boxes() 
    { 
     global $woocommerce, $post; 

     add_meta_box('cc_other_fields', __('Sessions','woocommerce'), 'cc_add_other_fields_for_packaging', 'product', 'side', 'core'); 
    } 
} 

// 
//adding Meta field in the meta container admin product pages 
// 
if (! function_exists('cc_save_wc_order_other_fields')) 
{ 
    function cc_add_other_fields_for_packaging() 
    { 
     global $woocommerce, $product, $post; 

     $meta_field_session_period = get_post_meta($post->ID, '_session_period', true) ? get_post_meta($post->ID, '_session_period', true) : ''; 

     $meta_field_number_sessions = get_post_meta($post->ID, '_number_sessions', true) ? get_post_meta($post->ID, '_number_sessions', true) : ''; 

     echo '<input type="hidden" name="cc_other_meta_field_nonce" value="' . wp_create_nonce() . '"> 
    <p><label style="display:inline-block;" class="cc_opt_label">' . __("Session period", "your_theme_slug") . '</label><br> 
     <input type="text" style="width:250px;";" name="session_period" placeholder="' . $meta_field_session_period . '" value="' . $meta_field_session_period . '"></p> 
    <p><label style="display:inline-block;" class="cc_opt_label">' . __("Number of sessions", "your_theme_slug") . '</label><br> 
     <input type="text" style="width:250px;";" name="number_sessions" placeholder="' . $meta_field_number_sessions . '" value="' . $meta_field_number_sessions . '"><br></p>'; 

    } 
} 

//Save the data of the product Meta fields pages 
add_action('save_post', 'cc_save_product_other_fields', 10, 1); 
if (! function_exists('cc_save_product_other_fields')) 
{ 

    function cc_save_product_other_fields($post_id) { 

     // We need to verify this with the proper authorization (security stuff). 

     // Check if our nonce is set. 
     if (! isset($_POST[ 'cc_other_meta_field_nonce' ])) { 
      return $post_id; 
     } 
     $nonce = $_REQUEST[ 'cc_other_meta_field_nonce' ]; 

     //Verify that the nonce is valid. 
     if (! wp_verify_nonce($nonce)) { 
      return $post_id; 
     } 

     // If this is an autosave, our form has not been submitted, so we don't want to do anything. 
     if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE) { 
      return $post_id; 
     } 

     // Check the user's permissions. 
     if ('page' == $_POST[ 'post_type' ]) { 

      if (! current_user_can('edit_page', $post_id)) { 
       return $post_id; 
      } 
     } else { 

      if (! current_user_can('edit_post', $post_id)) { 
       return $post_id; 
      } 
     } 
     // --- Its safe for us to save the data ! --- // 

     // Sanitize user input and update the meta field in the database. 
     update_post_meta($post_id, '_session_period', $_POST[ 'session_period' ]); 
     update_post_meta($post_id, '_number_sessions', $_POST[ 'number_sessions' ]); 
    } 
} 

Uwaga: można wkleić ten kod w pliku aktywnego dziecka function.php motyw lub temat.

JAK używać go w kodzie szablonu + SKORYGOWANEGO BŁĘDÓW:

nie trzeba będzie używać wtyczki ACF dla tych prostych pól. Znajdziesz tu również brakujący kod, aby pobrać identyfikator zamówienia, identyfikator produktu i wyświetlane na moim koncie> Aktualne Zlecenia stołowy, dane sesje:

// This is your existing code: 
<?php 

<?php foreach ($customer_orders as $customer_order) : 
       $order  = wc_get_order($customer_order); 

       // This way you can retrieve order ID: 
       $order_id = $order->post->ID; 

że trzeba dla:

if (get_field('date_ended', $order_id)) : 
// or 
if (get_field('date_ended', $order->post->id)) : 
// instead of: 
//get_field('date_ended', $order->id) 

// and use </p> instead of <p> at the end of this line: 
<p class="sendungsnummer"><?php the_field('date_ended', $order->id); ?></p> 

.../...

foreach($order->get_items() as $item) { 
$product_name = $item['name']; 

// This way you can retrieve product ID: 
$product_id = $item['product_id']; 

.../...

będzie uzyskać dostęp do tych danych z identyfikatora produktu (lub poczta ID) oraz funkcję Wordpress get_post_meta() w szablonie:

// Then you get your data fields with this two: 
$session_period = get_post_meta($product_id, '_session_period', true); 
$number_sessions = get_post_meta($product_id, '_number_sessions', true); 

I użyjesz ich, wyświetlając ich wartości w ten sposób:

echo $session_period; // For Session period 
echo $number_sessions; // For Number of sessions 

.../...

elseif ('sessions' === $column_id) // <=== It is 'sessions' instead of 'session' !!! 

Takie podejście jest bardziej profesjonalny i czystsze:

Screenshot

ta opiera się na innym problemem, ale jakiś podobny:
WooCommerce : Add custom Metabox to admin order page

+0

Przepraszamy za spóźnioną uwagę, próbowałem dodać kod do mojego functions.php i nie wydaje się, aby pokazać pole w admin shop_order. Wyświetla pole na stronach produktów, ale gdy próbowałem dokonać zakupu, pola z wartością nie pojawiają się w admin shop_order. Sprawdziłem twój drugi wpis, ale nie mogę go sprawić. – clestcruz

+0

Przepraszamy za brak jasności, ale muszę wyświetlić wartości po stronie shop_order administratora. Od samego początku moim celem jest wyświetlanie wartości nie tylko dla ostatnich zamówień klienta, ale wyświetlenie go w sklepie shop_order – clestcruz

+0

czy możemy kontynuować to przez czat – clestcruz

Powiązane problemy