복붙노트

[WORDPRESS] Woocommerce 관리자 주문에 대한 사용자 정의 메탈이있는 드롭 다운 필터 추가

WORDPRESS

Woocommerce 관리자 주문에 대한 사용자 정의 메탈이있는 드롭 다운 필터 추가

해결법


  1. 1.기존 코드를 조금 재검토하고 "마케팅 Optin"사용자 정의 필드에 대한 드롭 다운 필터를 추가했습니다.

    기존 코드를 조금 재검토하고 "마케팅 Optin"사용자 정의 필드에 대한 드롭 다운 필터를 추가했습니다.

    //1. ADD OPT IN OPTION IN CHECKOUT AND SAVE IN THE ORDER
    
    // Add checkbox optin before T&Cs
    add_action( 'woocommerce_checkout_before_terms_and_conditions', 'marketing_opting_field' );
    function marketing_opting_field() {
        echo '<div id="marketing_opting_field">';
        woocommerce_form_field( 'marketing_opting', array(
            'type'      => 'checkbox',
            'class'     => array('input-checkbox'),
            'label'     => __('Yes, sign me up'),
            'default'   => 1,
        ),  WC()->checkout->get_value( 'marketing_opting' ) );
        echo '</div>';
    }
    
    // Save the optin field as custom order meta, when checkbox has been checked
    add_action( 'woocommerce_checkout_create_order', 'action_checkout_update_order_meta', 10, 2 );
    function action_checkout_update_order_meta( $order, $data ) {
        if( isset($_POST['marketing_opting']) )
            $order->update_meta_data( '_marketing_opting', empty($_POST['marketing_opting']) ? 'no' : 'yes' );
    }
    
    // Save the optin field as custom user meta, when checkbox has been checked
    add_action( 'woocommerce_checkout_update_customer', 'action_checkout_update_customer_meta', 10, 2 );
    function action_checkout_update_customer_meta( $customer, $data ) {
        if( isset($_POST['marketing_opting']) )
            $customer->update_meta_data( 'marketing_opting', empty($_POST['marketing_opting']) ? 'no' : 'yes' );
    }
    
    // Display the result of the checked optin in the order under billing address
    add_action( 'woocommerce_admin_order_data_after_billing_address', 'display_custom_field_on_order_edit_pages', 10, 1 );
    function display_custom_field_on_order_edit_pages( $order ){
        if( $order->get_meta( '_marketing_opting' ) === 'yes' )
            echo '<p><strong>Has opted in for marketing purposes.</p>';
    }
    
    // 2. SHOW CUSTOM COLUMN FOR THE OPTIN OPTION
    
    // Adding custom column title
    add_filter( 'manage_edit-shop_order_columns', 'custom_shop_order_column', 12, 1 );
    function custom_shop_order_column($columns)
    {
        $action_column = $columns['order_actions'];
        unset($columns['order_actions']);
    
        //add the new column "Opt in"
        $columns['order_marketing'] = '<div align="center">' .__("Opted in?") . '</div>'; // title
        $columns['order_actions'] = $action_column;
    
        return $columns;
    }
    
    // Add the data for each order
    add_action( 'manage_shop_order_posts_custom_column' , 'custom_order_list_column_content', 10, 2 );
    function custom_order_list_column_content( $column, $post_id ){
        global $post, $the_order;
    
    
        if ($column ==='order_marketing') { 
            $value = $the_order->get_meta( '_marketing_opting' );
            $label = $value === 'yes' ? __('Signed Up') : ucfirst($value);
            $color = $value === 'yes' ? 'color:#00cc00;' : 'color:#bbbbbb;';
    
            echo '<p align="center" style="'.$color.'"><span class="dashicons dashicons-'.$value.'"></span><span style="font-weight:600;">'.$label.'</span></p>';
        }
    }
    
    // 3. Make marketing optin meta searchable from search field (can't work very well for 'yes' or 'no' values!)
    
    // Make a custom meta field searchable from the admin order list search field
    add_filter( 'woocommerce_shop_order_search_fields', 'marketing_search_fields', 10, 1 );
    function marketing_search_fields( $meta_keys ){
        $meta_keys[] = '_marketing_opting';
        return $meta_keys;
    }
    
    // 4. Add a dropdown filter to get orders by marketing optin meta value
    
    // Add a dropdown to filter orders by Marketing optin
    add_action( 'restrict_manage_posts', 'display_admin_shop_order_marketing_opting_filter' );
    function display_admin_shop_order_marketing_opting_filter(){
        global $pagenow, $post_type;
    
        if( 'shop_order' === $post_type && 'edit.php' === $pagenow ) {
            $domain    = 'woocommerce';
            $current   = isset($_GET['filter_shop_order_marketing'])? $_GET['filter_shop_order_marketing'] : '';
    
            echo '<select name="filter_shop_order_marketing">
            <option value="">' . __('Filter Marketing optin', $domain) . '</option>';
    
            $options = ['yes' => __('Signed Up'), 'no' => __('No')];
    
            foreach ( $options as $key => $label ) {
                printf( '<option value="%s"%s>%s</option>', $key, 
                    $key === $current ? '" selected="selected"' : '', $label );
            }
            echo '</select>';
        }
    }
    
    // Process the filter dropdown for orders by Marketing optin
    add_filter( 'request', 'process_admin_shop_order_marketing_opting_filter', 99 );
    function process_admin_shop_order_marketing_opting_filter( $vars ) {
        global $pagenow, $typenow;
    
        if ( $pagenow == 'edit.php' && isset( $_GET['filter_shop_order_marketing'] ) 
            && $_GET['filter_shop_order_marketing'] != '' && 'shop_order' === $typenow ) {
            $vars['meta_key']   = '_marketing_opting';
            $vars['meta_value'] = wc_clean( $_GET['filter_shop_order_marketing'] );
        }
        return $vars;
    }
    

    참고 : 나는 Meta_Key를 다른 기존 metakeys로 밑줄로 시작하는 meta_key를 _marketing_opting으로 변경했습니다 ...

    또한 주문을 한 고객을 위해 WC () -> 체크 아웃 -> GET_VALUE ( 'marketing_opting')의 체크 아웃에서 사용자 메타 데이터에 "마케팅 Optin"값을 등록하는 함수를 추가했습니다.

    코드는 Active Child Theme (또는 활성 테마)의 functions.php 파일입니다. 테스트하고 작동합니다.

  2. from https://stackoverflow.com/questions/61684222/add-a-dropdown-filter-for-a-custom-metakey-on-woocommerce-admin-orders by cc-by-sa and MIT license