Create function to give role a numeric value:
function get_user_level($role){
switch ($role) {
case 'Contributor':
return 1;
);
break;
case 'Author':
return 2;
);
break;
case 'Editor':
return 4;
break;
case 'Administrator':
return 5;
break;
case 'Super Admin':
return 6;
break;
default:
return 0; // default subscriber or other roles
break;
}
}
Now you can do without meta query:
$args = array( 'post_type'=>'gyo_kbs', 'posts_per_page'=>-1, 'orderby' => 'menu_order', 'order' => 'ASC'); // Removed meta query
$the_query = new WP_Query ( $args );
while ( $the_query -> have_posts() ) : $the_query -> the_post();
$allowed_role = get_post_meta( get_the_ID(), 'gyo_kb_roleview', true ); //get the meta value of allowed role
if( get_user_level($_role) < get_user_level($allowed_role) ){ // $_role from your question
continue; // skip post if the user role is less than allowed role
}
echo '<h1>' . $post -> post_title . '</h1>';
endwhile;
wp_reset_postdata();
Update: If You can save numeric value for the user role in post meta,
Then you can do:
$args = array( 'post_type'=>'gyo_kbs', 'posts_per_page'=>-1, 'orderby' => 'menu_order', 'order' => 'ASC',
'meta_query' => array(
array(
'key' => 'gyo_kb_roleview',
'value' => get_user_level($_role),
'compare' => '>='
),
)
);