web-dev-qa-db-ja.com

WoocommerceAdmin注文の詳細-注文の詳細ページにカスタムデータを表示する

2日間検索してみましたが、うまくいきませんでした。助けてください。

Woocommerce注文をフィルタリングして、製品属性に基づいてdbから注文詳細ページに詳細を追加したいのですが、このタスクに適したwoocommerceアクション/フィルターフックが見つかりません。ここで、変数$is_customized = falseがあるとします。

$is_customized == trueの場合、データベースから注文詳細ページにカスタムデータを追加する必要があります。

注:メタボックスを追加したくないので、代わりに次の注文詳細テーブルを変更したい:

  • デフォルトの製品イメージをデータベースに保存されているイメージに置き換え、
  • 製品名の下にカスタム属性を含むdivを追加します。

これらの値はすべて変数に含まれていますが、どのアクションフックを使用すればよいかわかりません。

わかりやすくするために画像を添付しました。

enter image description here

これらの注文結果を変更/フィルタリングできるかどうか、およびその方法を知る必要がありますか?

お手数をおかけしますが、よろしくお願いいたします。ありがとう

12
Haider Saeed

woocommerce_before_order_itemmeta フックにいくつかの追加データを表示する方法の開始は次のとおりです。

add_action( 'woocommerce_before_order_itemmeta', 'so_32457241_before_order_itemmeta', 10, 3 );
function so_32457241_before_order_itemmeta( $item_id, $item, $_product ){
    echo '<p>bacon</p>';
}

データをどのように保存しているかわからないため、これ以上正確な提案をすることはできません。そのフックの直後に、注文アイテムのメタとして保存したものはすべて自動的に表示されることに注意してください。

画像のフィルタリングはより困難です。私はこれを最初に見つけました 要点 ですが、サムネイルをどこでもフィルタリングしたくないので、いくつかのカスタム条件付きロジックが必要ですが、順序でのみフィルタリングします。

編集:現在、アイテムのサムネイルをフィルタリングするためにできる最善の方法は次のとおりです。

add_filter( 'get_post_metadata', 'so_32457241_order_thumbnail', 10, 4 );
function so_32457241_order_thumbnail( $value, $post_id, $meta_key, $single ) {
    // We want to pass the actual _thumbnail_id into the filter, so requires recursion
    static $is_recursing = false;
    // Only filter if we're not recursing and if it is a post thumbnail ID
    if ( ! $is_recursing && $meta_key === '_thumbnail_id' ) {
        $is_recursing = true; // prevent this conditional when get_post_thumbnail_id() is called
        $value = get_post_thumbnail_id( $post_id );
        $is_recursing = false;
        $value = apply_filters( 'post_thumbnail_id', $value, $post_id ); // yay!
        if ( ! $single ) {
            $value = array( $value );
        }
    }
    return $value;
}


add_filter( 'post_thumbnail_id', 'so_custom_order_item_thumbnail', 10, 2 );
function so_custom_order_item_thumbnail( $id, $post_id ){
    if( is_admin() ){
        $screen = get_current_screen();
        if( $screen->base == 'post' && $screen->post_type == 'shop_order' ){
            // this gets you the shop_order $post object
            global $post; 

            // no really *good* way to check post item, but could possibly save 
            // some kind of array in the order meta
            $id = 68;
        } 
    }
    return $id;
}
15
helgatheviking