Reescrever e tipo de publicação personalizado: ordem por campo personalizado não funcionando

Eu tenho um “posicionamento” de postagem personalizado com um campo personalizado “posição”. O que eu quero fazer é, na página de arquivamento de canais, pedir resultados pelo valor “posição”.

Eu tenho a seguinte regra de reescrita de URL:

$newRules['placements/?$'] = 'index.php?post_type=placement&meta_key=position&orderby=meta_value&order=DESC'; 

E é assim que é definido o meu tipo de postagem personalizado:

  function custom_post_type_placement() { $labels = array( 'name' => _x( 'Placements', 'Post Type General Name', 'text_domain' ), 'singular_name' => _x( 'Placement', 'Post Type Singular Name', 'text_domain' ), 'menu_name' => __( 'Placement', 'text_domain' ), 'name_admin_bar' => __( 'Placement', 'text_domain' ), 'parent_item_colon' => __( 'Parent Placement:', 'text_domain' ), 'all_items' => __( 'All Placements', 'text_domain' ), 'add_new_item' => __( 'Add New Placement', 'text_domain' ), 'add_new' => __( 'Add New', 'text_domain' ), 'new_item' => __( 'New Placement', 'text_domain' ), 'edit_item' => __( 'Edit Placement', 'text_domain' ), 'update_item' => __( 'Update Placement', 'text_domain' ), 'view_item' => __( 'View Placement', 'text_domain' ), 'search_items' => __( 'Search Placement', 'text_domain' ), 'not_found' => __( 'Not found', 'text_domain' ), 'not_found_in_trash' => __( 'Not found in Trash', 'text_domain' ), ); $args = array( 'label' => __( 'Placement', 'text_domain' ), 'description' => __( 'Placements', 'text_domain' ), 'labels' => $labels, 'supports' => array( 'title', 'editor', ), 'taxonomies' => array( 'journal_placement' ), 'hierarchical' => false, 'public' => true, 'show_ui' => true, 'show_in_menu' => true, 'menu_position' => 5, 'show_in_admin_bar' => true, 'show_in_nav_menus' => true, 'can_export' => true, 'has_archive' => true, 'exclude_from_search' => false, 'publicly_queryable' => true, 'capability_type' => 'page', ); register_post_type( 'placement', $args ); add_action( 'init', 'custom_post_type_placement', 0 ); 

Posso trocar ASC e DESC corretamente, mas meus resultados ainda são encomendados por data de publicação.

Aqui está o que a consulta parece:

SELECT SQL_CALC_FOUND_ROWS fetr_posts.ID FROM fetr_posts WHERE 1=1 AND fetr_posts.post_type = 'placement' AND (fetr_posts.post_status = 'publish' OR fetr_posts.post_status = 'private') ORDER BY fetr_posts.post_date DESC LIMIT 0, 10

Parece que os parâmetros meta_key e orderby não são considerados. Você tem alguma idéia do porquê e como ordenar o meu resultado corretamente usando uma regra de reescrita?


EDITAR: graças à resposta de Milo, mudei meu código da seguinte maneira e agora funciona.

Eu removi completamente a regra de reescrita e defini minha postagem personalizada como segue:

 function custom_post_type_placement() { $labels = array( 'name' => _x( 'Placements', 'Post Type General Name', 'text_domain' ), 'singular_name' => _x( 'Placement', 'Post Type Singular Name', 'text_domain' ), 'menu_name' => __( 'Placement', 'text_domain' ), 'name_admin_bar' => __( 'Placement', 'text_domain' ), 'parent_item_colon' => __( 'Parent Placement:', 'text_domain' ), 'all_items' => __( 'All Placements', 'text_domain' ), 'add_new_item' => __( 'Add New Placement', 'text_domain' ), 'add_new' => __( 'Add New', 'text_domain' ), 'new_item' => __( 'New Placement', 'text_domain' ), 'edit_item' => __( 'Edit Placement', 'text_domain' ), 'update_item' => __( 'Update Placement', 'text_domain' ), 'view_item' => __( 'View Placement', 'text_domain' ), 'search_items' => __( 'Search Placement', 'text_domain' ), 'not_found' => __( 'Not found', 'text_domain' ), 'not_found_in_trash' => __( 'Not found in Trash', 'text_domain' ), ); $rewrite = array( 'slug' => 'placements', 'with_front' => false, 'pages' => true, 'feeds' => false, ); $args = array( 'label' => __( 'Placement', 'text_domain' ), 'description' => __( 'Placements', 'text_domain' ), 'labels' => $labels, 'supports' => array( 'title', 'editor', ), 'taxonomies' => array( 'journal_placement' ), 'hierarchical' => false, 'public' => true, 'show_ui' => true, 'show_in_menu' => true, 'menu_position' => 5, 'show_in_admin_bar' => true, 'show_in_nav_menus' => true, 'can_export' => true, 'has_archive' => true, 'exclude_from_search' => false, 'publicly_queryable' => true, 'rewrite' => $rewrite, 'capability_type' => 'page', ); register_post_type( 'placement', $args ); } add_action( 'init', 'custom_post_type_placement', 0 ); 

e também adicionei esta function:

 function order_by_position($query){ if(is_post_type_archive( 'placement' )){ $query->query_vars['meta_key']="position"; $query->query_vars['orderby']="meta_value_num"; } return $query; } add_action( 'pre_get_posts', 'order_by_position' ); 

Solutions Collecting From Web of "Reescrever e tipo de publicação personalizado: ordem por campo personalizado não funcionando"

Se o slug do seu tipo de publicação for colocado, e você definiu o has_archive como true , o arquivo WordPress gera é em /placement/ . Defina has_archive para placements vez disso e deixe WordPress adicionar as regras de reescrita (que também irá lidar com a paginação corretamente).

Em seguida, para ordenar por sua meta-chave, adicione uma function conectada a pre_get_posts , verifique se a consulta is_main_query() e is_post_type_archive( 'placement' ) , então defina seus parâmetros de meta_query lá.