3

So I am building a custom section on the WooCoommerce's my account/my-orders.php template file to only show order history of any products that are under the category "courses".

I currently have this:

<?php
$my_orders_columns = apply_filters(
    'woocommerce_my_account_my_orders_columns',
    array(
        'order-number'  => esc_html__( 'Order', 'woocommerce' ),
        'order-date'    => esc_html__( 'Date', 'woocommerce' ),
        'order-status'  => esc_html__( 'Status', 'woocommerce' ),
        'order-total'   => esc_html__( 'Total', 'woocommerce' ),
        'order-actions' => '&nbsp;',
    )
);

$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 ) : ?>

    <?php if(is_product_category('course')) { ?>

            <section class='courseHistory'>
                <div class='grid-container full'>
                     <?php
                        foreach ( $customer_orders as $customer_order ) :
                            $order      = wc_get_order( $customer_order ); // phpcs:ignore WordPress.WP.GlobalVariablesOverride.Prohibited
                            $item_count = $order->get_item_count();
                        ?>
                    <div class='grid-x'>

                              <!-- Course loop to go here -->
                                <?php foreach ( $my_orders_columns as $column_id => $column_name ) : ?>
                            <div class='large-12 cell marB20 shadow'>
                        <div class='grid-x'>
                            <div class='small-12 medium-12 large-3 cell courseImg'>
                                                      <!-- Course image here -->
                                    <img src="<?php echo get_template_directory_uri(); ?>/assets/images/course.png"/>
                                                </div>
                                                <div class='small-12 medium-12 large-9 cell courseInfo whiteBg'>
                                                        <div class='grid-x grid-margin-x align-middle'>
                                    <div class='small-12 medium-12 large-7 cell'>
                                                                      <div class='grid-x'>
                                            <div class='large-5 cell'>
                                                                                        <p class='bold title'>Course name:</p>
                                                                                </div>
                                                                                <div class='large-auto cell'>
                                                                                        <!-- Course title here -->

                                                                                        <p class='noweight title'><?php echo the_dramatist_get_order_prod_name( $order ); // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped ?></p>
                                                                                </div>
                                                                        </div>
                                                                        <div class='grid-x'>
                                            <div class='large-5 cell'>
                                                                                        <p class='bold title'>Date of course:</p>
                                                                                </div>
                                                                                <div class='large-auto cell'>
                                                                                        <!-- Date of course from calendar here -->

                                                                                        <p class='noweight title'>21.01.21</p>
                                                                                </div>
                                                                        </div>
                                                                        <div class='grid-x'>
                                            <div class='large-5 cell'>
                                                                                        <p class='bold title'>Paid on:</p>
                                                                                </div>
                                                                                <div class='large-auto cell'>
                                                                                        <!-- Purchase date here -->
                                                                                        <p class='noweight title'><time datetime="<?php echo esc_attr( $order->get_date_created()->date( 'c' ) ); ?>"><?php echo esc_html( wc_format_datetime( $order->get_date_created() ) ); ?></time></p>
                                                                                </div>
                                                                        </div>
                                                                        <div class='grid-x'>
                                            <div class='large-5 cell'>
                                                                                        <p class='bold title'>Status:</p>
                                                                                </div>
                                                                                <div class='large-auto cell'>
                                                                                        <!-- Purchase status here -->

                                                                                        <p class='noweight title'><?php echo esc_html( wc_get_order_status_name( $order->get_status() ) ); ?></p>
                                                                                </div>
                                                                        </div>
                                                                </div>
                                                                <div class='small-12 medium-12 large-5 cell'>
                                                                      <!-- Link to course to go through to shop info page? -->
                                        <a class='orangeB' href="<?php echo the_permalink(); ?>">View course overview</a>
                                                                        <!-- Link to PPE for this course here.
                                                                        I've done it so each PPE product will have a course sub category that can be assigned to it to make filtering easier.
                                        PPE Cat > Course PPE sub cat
                                                                      -->
                                                                        <a class='blackB marT20' href="<?php echo the_permalink(); ?>">Get PPE for this course</a>
                                                                </div>
                                                        </div>
                                                </div>
                                        </div>
                                </div>
                                <!-- Course loop end -->
                    <?php endforeach; ?>
                </div>
                        <?php endforeach; ?>
                </div>
        </section>

    <?php } else { ?>
dsfdsf
    <?php } ?>

<?php endif; ?>

This is pulling through the order history in a loop how I want it, but I've gone to add a conditional if is_product_category('course') around it and it's not pulling anything through.

Feel I'm close but missing something?

LoicTheAztec
  • 229,944
  • 23
  • 356
  • 399
Sadie
  • 45
  • 4

1 Answers1

2

There are some little mistakes in your code… To check for a product category, you need to check in order items (for each order) using has_terms() Wordpress conditional function as follow:

<?php
$my_orders_columns = apply_filters(
    'woocommerce_my_account_my_orders_columns',
    array(
        'order-number'  => esc_html__( 'Order', 'woocommerce' ),
        'order-date'    => esc_html__( 'Date', 'woocommerce' ),
        'order-status'  => esc_html__( 'Status', 'woocommerce' ),
        'order-total'   => esc_html__( 'Total', 'woocommerce' ),
        'order-actions' => '&nbsp;',
    )
);

$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() ),
        )
    )
);

$product_category_terms = array('course'); // <== Here the defined product category term(s)

if ( $customer_orders ) : ?>
    <section class='courseHistory'>
        <div class='grid-container full'>
            <?php foreach ( $customer_orders as $customer_order ) :
                $order      = wc_get_order( $customer_order ); // phpcs:ignore WordPress.WP.GlobalVariablesOverride.Prohibited
                $item_count = $order->get_item_count();

                $category_found = false; // Initializing

                // Loop through order items
                foreach ( $order->get_items() as $item ) {
                    if ( has_term( $product_category_terms, 'product_cat', $item->get_product_id() ) ) {
                        $category_found = true;
                        break;
                    }
                }

                // If the product category is not found in order items we jump to next order
                if ( ! $category_found ) continue;
            ?>
            <div class='grid-x'>
            <!-- Course loop to go here -->
            <?php foreach ( $my_orders_columns as $column_id => $column_name ) : ?>
                <div class='large-12 cell marB20 shadow'>
                    <div class='grid-x'>
                        <div class='small-12 medium-12 large-3 cell courseImg'>
                            <!-- Course image here -->
                            <img src="<?php echo get_template_directory_uri(); ?>/assets/images/course.png"/>
                        </div>
                        <div class='small-12 medium-12 large-9 cell courseInfo whiteBg'>
                            <div class='grid-x grid-margin-x align-middle'>
                                <div class='small-12 medium-12 large-7 cell'>
                                    <div class='grid-x'>
                                        <div class='large-5 cell'>
                                            <p class='bold title'>Course name:</p>
                                        </div>
                                        <div class='large-auto cell'>
                                            <!-- Course title here -->
                                            <p class='noweight title'><?php echo the_dramatist_get_order_prod_name( $order ); // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped ?></p>
                                        </div>
                                    </div>
                                    <div class='grid-x'>
                                        <div class='large-5 cell'>
                                            <p class='bold title'><?php esc_html_e("Date of course:", "woocommerce"); ?></p>
                                        </div>
                                        <div class='large-auto cell'>
                                            <!-- Date of course from calendar here -->
                                            <p class='noweight title'><?php _e("21.01.21", "woocommerce"); ?></p>
                                        </div>
                                    </div>
                                    <div class='grid-x'>
                                        <div class='large-5 cell'>
                                            <p class='bold title'><?php esc_html_e("Paid on:", "woocommerce"); ?></p>
                                        </div>
                                        <div class='large-auto cell'>
                                            <!-- Purchase date here -->
                                            <p class='noweight title'><time datetime="<?php esc_attr_e( $order->get_date_created()->date( 'c' ) ); ?>"><?php  esc_html_e( wc_format_datetime( $order->get_date_created() ) ); ?></time></p>
                                        </div>
                                    </div>
                                    <div class='grid-x'>
                                        <div class='large-5 cell'>
                                            <p class='bold title'><?php esc_html_e("Status:", "woocommerce"); ?></p>
                                        </div>
                                        <div class='large-auto cell'>
                                            <!-- Purchase status here -->
                                            <p class='noweight title'><?php esc_html_e( wc_get_order_status_name( $order->get_status() ) ); ?></p>
                                        </div>
                                    </div>
                                </div>
                                <div class='small-12 medium-12 large-5 cell'>
                                    <!-- Link to course to go through to shop info page? -->
                                    <a class='orangeB' href="<?php the_permalink(); ?>"><?php esc_html_e("View course overview", "woocommerce"); ?></a>
                                    <!-- Link to PPE for this course here. I've done it so each PPE product will have a course sub category
                                    that can be assigned to it to make filtering easier. PPE Cat > Course PPE sub cat -->
                                    <a class='blackB marT20' href="<?php the_permalink(); ?>"><?php esc_html_e("Get PPE for this course", "woocommerce"); ?></a>
                                </div>
                            </div>
                        </div>
                    </div>
                </div>
                <!-- Course loop end -->
                <?php endforeach; ?>
            </div>
            <!-- Orders loop end -->
            <?php endforeach; ?>
        </div>
    </section>
<?php endif; ?>

It should work.

LoicTheAztec
  • 229,944
  • 23
  • 356
  • 399
  • That's pulled through all the course orders, but it's duplicating them, so i have 4 instances of the same order showing? Is there a way to fix the loop to only show one instance? Also only show the course in the order and no other products that don't belong to courses as it's showing those as well. – Sadie Sep 04 '20 at 10:34
  • My answer here, is just answering your initial question, with the material you provided (and nobody can guess what your orders are made of). If you have some other questions, you should better ask a new question. – LoicTheAztec Sep 05 '20 at 22:02