By setting a meta_key to the field you want to sort after you can modify the order of a query based on a cmb2 field and also combine with others.
This example sort by the field first then after date
$query->set('meta_key', '_mycmb2box_myspecialfield' ); $query->set('orderby', array('meta_value' => 'DESC', 'date' => 'DESC'));
This example pre gets ALL posts for a CPT and then sorting based on cmb2 values:
add_action( 'pre_get_posts', 'my_custom_namespace_pre_get_post' ); function my_custom_namespace_pre_get_post( $query ) { if( is_post_type_archive( 'my_custom_namespace_my_custom_post_type' ) && !is_admin() && $query->is_main_query() ) { $query->set( 'posts_per_page', -1 ); $query->set('meta_key', '_my_custom_namespace_my_custom_field' ); $query->set('orderby', array('meta_value' => 'DESC', 'date' => 'DESC')); } }
Important to note that if the meta key is not set for a post it won’t load in at all, so use that with a cmb2 field
its good to set a default value in the following manner:
$my_custom_namespace->add_field( array( 'name' => __( 'Custom Field', 'my_custom_namespace' ), 'desc' => __( 'This is my custom field', 'my_custom_namespace' ), 'id' => $prefix . 'my_custom_field', 'type' => 'text', 'default' => '0', 'attributes' => array( 'type' => 'number', ), ) );