按事件时间划分的Woocommerce排序列

时间:2016-06-01 08:57:23

标签: php wordpress woocommerce

我正在使用Wordpress,Woocommerce& Eventon插件为活动网站创建销售门票。用户可以订购不同日期的门票。

我试图实现一个可排序的列,其中显示了每个售出事件日期的票证(存储在woocommerce_order_itemmeta表中作为meta_key的元数值'事件时间')。首先,我创建并填充了这样的列:

add_filter( 'manage_edit-shop_order_columns', 'wooc_set_custom_column_order_columns');

//create custom woocommerce columns
function wooc_set_custom_column_order_columns($columns) {@
$nieuwearray = array();
 foreach($columns as $key => $title) {
   if ($key=='billing_address') { // in front of the Billing column
    $nieuwearray['order_product']  = __( 'Products', 'woocommerce' );
    $nieuwearray['Event-Time']  = __( 'Reservation Date', 'woocommerce' );
   }
   $nieuwearray[$key] = $title;
  }
    return $nieuwearray ;
}

//populate custom woocommerce columns
add_action( 'manage_shop_order_posts_custom_column' , 'custom_shop_order_column', 10, 2 );

function custom_shop_order_column( $column ) {
 global $post, $woocommerce, $the_order;

    switch ( $column ) {

        case 'order_product' :
        $terms = $the_order->get_items();
        if ( is_array( $terms ) ) {
            foreach($terms as $term)
            {
                echo $term['item_meta']['_qty'][0] .' x ' . $term['name'] .'<br />';
            }
        } else {
            _e( 'Unable get the product', 'woocommerce' );
        }
        break;

        case 'Event-Time' :
        $terms = $the_order->get_items();
        if ( is_array( $terms ) ) {
            foreach($terms as $term) {
                if(array_key_exists( 'Event-Time', $term ) ){
                    $date_event = substr($term['item_meta']['Event-Time'][0], 0, 10);
                    echo  $date_event . '<br />';
                } else {
                    echo '<b>' . __('No existe fecha reserva?', 'woocommerce') . '</b>';
                }   
            }
        } else {
            _e( 'Unable get the product', 'woocommerce' );
        }
        break;
    }
}

为了使Event-Time列可排序,我添加了以下代码:

add_filter( "manage_edit-shop_order_sortable_columns", 'sort_columns_woocommerce' );
    function sort_columns_woocommerce( $columns ) {
        $custom = array(
            //'order_producten'    => 'MY_COLUMN_1_POST_META_ID',
            'Event-Time'    =>  'Event-Time'
        );
        return wp_parse_args( $custom, $columns );
    }

但没有任何事情发生,所以几个小时后在Google上查看,我发现similar solution我试图适应我的情况:

function order_by_event_time_join($query) {
    global $wpdb;

    if ( is_admin() && (isset($_GET['post_type']) && $_GET['post_type'] === 'shop_order') && (isset($_GET['orderby']) && $_GET['orderby'] === 'Event-Time') ) {
        $first_item_in_order = "SELECT order_item_id FROM {$wpdb->prefix}woocommerce_order_items WHERE order_id = $wpdb->posts.ID AND order_item_type = 'line_item' LIMIT 0, 1";
        $query .= "LEFT JOIN {$wpdb->prefix}woocommerce_order_items AS items ON $wpdb->posts.ID = items.order_id AND items.order_item_id = ($first_item_in_order) ";
        $query .= "LEFT JOIN {$wpdb->prefix}woocommerce_order_itemmeta AS itemmeta ON items.order_item_id = itemmeta.order_item_id AND (itemmeta.meta_key = 'Event-Time') ";
    }

    return $query;
}

add_filter('posts_join', 'order_by_event_time_join');


function order_by_event_time_where($where) {
    global $wpdb;

    if( is_admin() && $_GET['post_type'] === 'shop_order' && (isset($_GET['orderby']) && $_GET['orderby'] === 'Event-Time') ) {
        if(strpos($where, 'shop_webhook')) {
            return " AND $wpdb->posts.post_type = 'shop_order' AND itemmeta.meta_key = 'Event-Time'";
        }
    }

    return $where;
}

add_filter('posts_where', 'order_by_event_time_where');

但没有运气......我理解的问题是我无法通过meta_value&#39; Event-Time&#39;排序列。在woocommerce的门票部分...... 我可以显示事件时间数据,但无法对其进行排序/过滤。

0 个答案:

没有答案