質問: 'shop_order' ) { $query->set('meta_key', '_payment_method'); $query->set('meta_value', 'pay by phone'); } return $query; } add_filter('pre_get_posts', 'filter_orders_pay_by_phone'); クリックするとページが更新され、このフィルタが追加されるため、この管理ページに「電話の注文」というボタン、または別の並べ替えオプション(「電話の注文」)を挿入する必要があります。が表示されます。私はこの機能を生成するために私が使用できるどんなフックも知らない。
回答: ここでは、特定のmeta_keyのすべての可能なmeta_valuesを取得するための関数を作成しました。それからrestrict_manage_postsをフックして、フィルタフォームにmeta_valuesの新しいselectフィールドを追加しました。最後にparse_queryをフックして新しいフィルタをpostクエリに追加しました。// global to be used to stop filter from running on get_posts() in get_meta_values() $globals['run_meta_filter_on_query'] = true; // function to grab all possible meta values of the chosen meta key in this case '_payment_method' function get_meta_values( $meta_key, $post_type = 'post' ) { $globals['run_meta_filter_on_query'] = false; $posts = get_posts( array( 'post_type' => $post_type, 'meta_key' => $meta_key, 'posts_per_page' => -1, ) ); $globals['run_meta_filter_on_query'] = true; $meta_values = array(); foreach( $posts as $post ) { $meta_values[] = get_post_meta( $post->id, $meta_key, true ); } return $meta_values; } //hook the filter options form add_action('restrict_manage_posts','add_meta_value_to_posts'); function add_meta_value_to_posts(){ // only add filter to shop_order global $post_type; if( $post_type == 'shop_order' ) { // function to grab all possible meta values of the chosen meta key in this case '_payment_method' $meta_values = get_meta_values('_payment_method', 'shop_order'); // generate select field from meta values echo '<select name="_payment_method" id="_payment_method">'; $all_selected = sanitize_text_field($_get['_payment_method']) == 'all' ? ' selected' : ''; echo '<option value="all"'.$all_selected.'>all</option>'; foreach ( $meta_values as $meta_value ) { $selected = sanitize_text_field($_get['_payment_method']) == $meta_value ? ' selected' : ''; echo '<option value="'.$meta_value.'"'.$selected.'>'.$meta_value.'</option>'; } echo '</select>'; } } // hook parse_query to add new filter parameters add_action('parse_query','filter_posts_per_meta_value'); function filter_posts_per_meta_value( $query ) { global $pagenow, $post_type; // only add parmeeters if on shop_order and if all is not selected if( $pagenow == 'edit.php' && $post_type == 'shop_order' && !empty($_get['_payment_method']) && $_get['_payment_method'] != 'all' && $globals['run_meta_filter_on_query'] ) { $query->query_vars['meta_query'][] = array( 'key' => '_payment_method', 'value' => $_get['_payment_method'], 'compare' => '=', ); } }