WooCommerce - 将产品类别添加到订单详细信息表

时间:2014-06-25 17:18:07

标签: php wordpress woocommerce


以下是我尝试做的事情以及在哪里。

在订单的结帐流程中,在插件WooCommerce中;当结账过程完成后,您将被带到页面。它显示订单详细信息的概述。用于输出此页面的模板文件是order-details.php。

以下是我要添加的内容

我想像这样显示产品的产品类别:

enter image description here

这是我试图添加到代码明细表第一部分的代码区域。

<tbody>
    <?php
    if ( sizeof( $order->get_items() ) > 0 ) {

        foreach( $order->get_items() as $item ) {
            $_product     = apply_filters( 'woocommerce_order_item_product', $order->get_product_from_item( $item ), $item );
            $item_meta    = new WC_Order_Item_Meta( $item['item_meta'], $_product );

            ?>
            <tr class="<?php echo esc_attr( apply_filters( 'woocommerce_order_item_class', 'order_item', $item, $order ) ); ?>">
                <td class="product-name">
                    <?php
                        if ( $_product && ! $_product->is_visible() )
                            echo apply_filters( 'woocommerce_order_item_name', $item['name'], $item );
                        else
                            echo apply_filters( 'woocommerce_order_item_name', sprintf( '<a href="%s">%s</a>', get_permalink( $item['product_id'] ), $item['name'] ), $item );

                        echo apply_filters( 'woocommerce_order_item_quantity_html', ' <strong class="product-quantity">' . sprintf( '&times; %s', $item['qty'] ) . '</strong>', $item );

到目前为止,这是我的理解;

  • 正在应用自定义查询。
  • 每个产品列出的细节都在回应。
  • 正在使用WooCommerce类来获取特定的产品元素。

我的理解是目前知识水平的观察。

我希望我可以使用类似

的内容
echo apply_filters( 'woocommerce_order_item_name', ' <strong class="product-category">' . e_( $item['product_cat'] ) . '</strong>', $item );

我无法找到更相关的过滤器,我真的不确定[&#39; product_cat&#39;]在这里是否相关。这是我试图解决我的要求的一个例子。

正如您所知,我不是全职工作的PHP。我尽可能多地学习。建议将不胜感激

1 个答案:

答案 0 :(得分:3)

这是您可以将产品类别添加到产品标题的方法。我不是特别喜欢它为我输出的方式,但后来我在变量订阅上测试它,所以这是修改自己的数据。这将出现在你的主题函数中.php

function kia_woocommerce_order_item_name( $name, $item ){

    $product_id = $item['product_id'];
    $tax = 'product_cat';

    $terms = wp_get_post_terms( $product_id, $tax, array( 'fields' => 'names' ) );

    if( $terms && ! is_wp_error( $terms )) {
        $taxonomy = get_taxonomy($tax);
        $name .= '<label>' . $taxonomy->label . ': </label>' . implode( ', ', $terms );
    }

    return $name;
}
add_filter( 'woocommerce_order_item_name', 'kia_woocommerce_order_item_name', 10, 2 );

否则,您可以将order-details.php模板复制到您自己的主题中(所以yourtheme/woocommerce/order/order-details.php并直接添加代码。这样可以让您更好地控制您希望类别显示的位置,因为没有&#39 ;本节中提供了很多钩子,但如果WooCommerce修改了这段代码,你就会面临风险。我曾经在一些网站上工作,因为主题使用了过时的模板。

无论如何,一个例子是:

<?php
/**
 * Order details
 *
 * @author      WooThemes
 * @package     WooCommerce/Templates
 * @version     2.2.0
 */

if ( ! defined( 'ABSPATH' ) ) exit; // Exit if accessed directly

global $woocommerce;

$order = new WC_Order( $order_id );
?>
<h2><?php _e( 'Order Details', 'woocommerce' ); ?></h2>
<table class="shop_table order_details">
    <thead>
        <tr>
            <th class="product-name"><?php _e( 'Product', 'woocommerce' ); ?></th>
            <th class="product-total"><?php _e( 'Total', 'woocommerce' ); ?></th>
        </tr>
    </thead>
    <tfoot>
    <?php
        if ( $totals = $order->get_order_item_totals() ) foreach ( $totals as $total ) :
            ?>
            <tr>
                <th scope="row"><?php echo $total['label']; ?></th>
                <td><?php echo $total['value']; ?></td>
            </tr>
            <?php
        endforeach;
    ?>
    </tfoot>
    <tbody>
        <?php
        if ( sizeof( $order->get_items() ) > 0 ) {

            foreach( $order->get_items() as $item ) {
                $_product     = apply_filters( 'woocommerce_order_item_product', $order->get_product_from_item( $item ), $item );
                $item_meta    = new WC_Order_Item_Meta( $item['item_meta'], $_product );

                ?>
                <tr class="<?php echo esc_attr( apply_filters( 'woocommerce_order_item_class', 'order_item', $item, $order ) ); ?>">
                    <td class="product-name">
                        <?php
                            if ( $_product && ! $_product->is_visible() )
                                echo apply_filters( 'woocommerce_order_item_name', $item['name'], $item );
                            else
                                echo apply_filters( 'woocommerce_order_item_name', sprintf( '<a href="%s">%s</a>', get_permalink( $item['product_id'] ), $item['name'] ), $item );

                            echo apply_filters( 'woocommerce_order_item_quantity_html', ' <strong class="product-quantity">' . sprintf( '&times; %s', $item['qty'] ) . '</strong>', $item );

                            $item_meta->display();

                            // insert product category here
                            $tax = 'product_cat';
                            $terms = wp_get_post_terms( $_product->id, $tax, array( 'fields' => 'names' ) );

                            if( $terms && ! is_wp_error( $terms )) {
                                $taxonomy = get_taxonomy($tax);
                                echo '<strong>' . $taxonomy->label . ': </strong>' . implode( ', ', $terms );
                            }

                            // end edit

                            if ( $_product && $_product->exists() && $_product->is_downloadable() && $order->is_download_permitted() ) {

                                $download_files = $order->get_item_downloads( $item );
                                $i              = 0;
                                $links          = array();

                                foreach ( $download_files as $download_id => $file ) {
                                    $i++;

                                    $links[] = '<small><a href="' . esc_url( $file['download_url'] ) . '">' . sprintf( __( 'Download file%s', 'woocommerce' ), ( count( $download_files ) > 1 ? ' ' . $i . ': ' : ': ' ) ) . esc_html( $file['name'] ) . '</a></small>';
                                }

                                echo '<br/>' . implode( '<br/>', $links );
                            }
                        ?>
                    </td>
                    <td class="product-total">
                        <?php echo $order->get_formatted_line_subtotal( $item ); ?>
                    </td>
                </tr>
                <?php

                if ( $order->has_status( array( 'completed', 'processing' ) ) && ( $purchase_note = get_post_meta( $_product->id, '_purchase_note', true ) ) ) {
                    ?>
                    <tr class="product-purchase-note">
                        <td colspan="3"><?php echo wpautop( do_shortcode( $purchase_note ) ); ?></td>
                    </tr>
                    <?php
                }
            }
        }

        do_action( 'woocommerce_order_items_table', $order );
        ?>
    </tbody>
</table>

<?php do_action( 'woocommerce_order_details_after_order_table', $order ); ?>

<header>
    <h2><?php _e( 'Customer details', 'woocommerce' ); ?></h2>
</header>
<dl class="customer_details">
<?php
    if ( $order->billing_email ) echo '<dt>' . __( 'Email:', 'woocommerce' ) . '</dt><dd>' . $order->billing_email . '</dd>';
    if ( $order->billing_phone ) echo '<dt>' . __( 'Telephone:', 'woocommerce' ) . '</dt><dd>' . $order->billing_phone . '</dd>';

    // Additional customer details hook
    do_action( 'woocommerce_order_details_after_customer_details', $order );
?>
</dl>

<?php if ( ! wc_ship_to_billing_address_only() && $order->needs_shipping_address() && get_option( 'woocommerce_calc_shipping' ) !== 'no' ) : ?>

<div class="col2-set addresses">

    <div class="col-1">

<?php endif; ?>

        <header class="title">
            <h3><?php _e( 'Billing Address', 'woocommerce' ); ?></h3>
        </header>
        <address><p>
            <?php
                if ( ! $order->get_formatted_billing_address() ) _e( 'N/A', 'woocommerce' ); else echo $order->get_formatted_billing_address();
            ?>
        </p></address>

<?php if ( ! wc_ship_to_billing_address_only() && $order->needs_shipping_address() && get_option( 'woocommerce_calc_shipping' ) !== 'no' ) : ?>

    </div><!-- /.col-1 -->

    <div class="col-2">

        <header class="title">
            <h3><?php _e( 'Shipping Address', 'woocommerce' ); ?></h3>
        </header>
        <address><p>
            <?php
                if ( ! $order->get_formatted_shipping_address() ) _e( 'N/A', 'woocommerce' ); else echo $order->get_formatted_shipping_address();
            ?>
        </p></address>

    </div><!-- /.col-2 -->

</div><!-- /.col2-set -->

<?php endif; ?>

<div class="clear"></div>