Zeigen Sie das erweiterte benutzerdefinierte Feld des Produkt-Post-Typs in der Vorlage für kürzliche Bestellungen und Admin-Bestellungen an (Woocommerce)

Lesezeit: 9 Minuten

Zeigen Sie das erweiterte benutzerdefinierte Feld des Produkt Post Typs in der
clestcruz

Ich versuche, die Felder anzuzeigen, die ich in der letzten Bestellvorlage von WooCommerce erstellt habe, und ich kenne mich mit PHP nicht sehr gut aus.

Ich habe ein Feld namens Sessions erstellt und mich als Produktbeitragstyp registriert. Sobald ein Benutzer ein Produkt kauft, möchte ich, dass dies Zollfelder sind “Sitzungen” Werte, die in Mein Konto > Letzte Bestellungen (Vorlage) angezeigt werden sollen.

Ich habe versucht, nach Antworten und Lösungen zu suchen, und ich scheine festzustecken.

Hier ist der benutzerdefinierte Code der my-order.php-Vorlage, an der ich gearbeitet habe. Ich habe es tagelang gehackt und kann diese Werte anscheinend nicht in meiner Tabelle der letzten Bestellungen anzeigen.

Aktualisiert – Bilder und weitere Beschreibungen hinzugefügt, um mein Problem zu verdeutlichen

1.) Wie Sie hier sehen können, habe ich zwei Arten von Feldern erstellt und als registriert Produktbeitragstyp

Geben Sie hier die Bildbeschreibung ein

2.) Dann habe ich diesen beiden Feldern, die ich erstellt habe, einen Wert zugewiesen

Geben Sie hier die Bildbeschreibung ein

3.) Sobald ein Benutzer oder Kunde den Artikel/das Produkt/das Paket kauft. Ich möchte, dass diese beiden Werte in den letzten Bestellungen der Vorlage „Mein Konto“ des Benutzers unter der Spalte angezeigt werden “Sitzungen”

Geben Sie hier die Bildbeschreibung ein

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="'%20.%20esc_url(%20$action['url']%20)%20.%20'" class="button ' . sanitize_html_class( $key ) . '">' . esc_html( $action['name'] ) . '</a>';
                                        }
                                    }
                                    */
                                ?>
                            <?php endif; ?>
                        </td>
                    <?php endforeach; ?>
                </tr>
            <?php endforeach; ?>
        </tbody>
    </table>
<?php endif; ?>

  • Ja, Sie werden dort auf der Seitenvorlage oder Produktseite angezeigt

    – clestcruz

    18. Juni 2016 um 6:28 Uhr

  • Ja, sie sind auf allen einzelnen Produktseiten enthalten

    – clestcruz

    18. Juni 2016 um 6:41 Uhr

  • Hmmm werde es versuchen, ich verwende das Plugin namens “erweiterte benutzerdefinierte Felder” in meinem Projekt.

    – clestcruz

    18. Juni 2016 um 7:00 Uhr

Zeigen Sie das erweiterte benutzerdefinierte Feld des Produkt Post Typs in der
LoicTheAztec

Hier verfolgen wir einen anderen Ansatz als benutzerdefinierte Felder, die mit dem ACF-Plugin erstellt wurden. Wir erstellen eine dedizierte Metabox mit 2 Feldern darin, die sich in der rechten Spalte auf den Backend-Produktseiten befindet, mit diesem Code:

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

Notiz: Sie werden diesen Code in die einfügen function.php Datei des aktiven Child-Themes oder Themes.

WIE SIE IHN IN IHREM VORLAGENCODE VERWENDEN + DIE KORRIGIERTEN FEHLER:

Für diese einfachen Felder müssen Sie das ACF-Plugin nicht verwenden. Sie finden auch den fehlenden Code zum Abrufen der Bestell-ID, der Produkt-ID und zum Anzeigen in der Tabelle “Mein Konto” > “Letzte Bestellungen”. die Sitzungsdaten:

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

Das brauchst du für:

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

… / …

Auf diese Daten greifen Sie mit Produkt-ID (bzw. Post-ID) und der WordPress-Funktion zu get_post_meta() in deiner Vorlage:

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

Und Sie werden sie verwenden und ihre Werte auf diese Weise anzeigen:

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

… / …

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

Dieser Ansatz ist professioneller und sauberer:

Bildschirmfoto

Dies basiert auf einem anderen Problem, aber irgendwie ähnlich:
WooCommerce: Fügen Sie der Admin-Bestellseite eine benutzerdefinierte Metabox hinzu

  • Entschuldigung für den späten Kommentar, ich habe versucht, den Code in meine functions.php einzufügen, und es scheint, dass das Feld im Admin-Shop nicht angezeigt wird. Es zeigt das Feld auf den Produktseiten an, aber als ich versuchte, einen Kauf zu tätigen, scheinen die Felder mit dem Wert nicht in der Admin-Shop-Bestellung zu erscheinen. Ich habe deinen anderen Beitrag überprüft, aber ich kann es nicht zum Laufen bringen

    – clestcruz

    19. Juni 2016 um 12:05 Uhr

  • Tut mir leid, dass ich nicht klar bin, aber ich muss die Werte auf der Seite shop_order des Administrators anzeigen. Mein Ziel ist es von Anfang an, die Werte nicht nur für die letzten Bestellungen des Kunden anzuzeigen, sondern im Admin shop_order anzuzeigen

    – clestcruz

    19. Juni 2016 um 12:20 Uhr


  • können wir das per Chat fortsetzen

    – clestcruz

    19. Juni 2016 um 12:41 Uhr

923380cookie-checkZeigen Sie das erweiterte benutzerdefinierte Feld des Produkt-Post-Typs in der Vorlage für kürzliche Bestellungen und Admin-Bestellungen an (Woocommerce)

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy