#php #wordpress
Вопрос:
У меня есть следующая функция, в которой я создаю свою собственную навигацию между родителями и детьми.
Проблема, с которой я сталкиваюсь, заключается в том, что я не смог заказать детей по menu_order ( поэтому заказывайте по атрибуту заказа, который может быть установлен на каждой странице при повторном заказе ). Любые советы о том, как это сделать, будут весьма признательны.
function wph_get_page_tree( $page_id ){
global $wpdb;
$tree_data = [];
$tree_data[$page_id] = ['title' => get_post($page_id)->post_title, 'ID' => $page_id];
// get 1 level childs
$level_1_childs = [];
$all_childs = $wpdb->get_results( $wpdb->prepare( "SELECT ID, post_title FROM {$wpdb->posts} WHERE post_parent = %d amp;amp; post_type= 'page' amp;amp; post_status='publish' ", $page_id ) );
foreach( $all_childs as $single_2_level ){
$level_1_childs[$single_2_level->ID] = ['title' => $single_2_level->post_title, 'ID' => $single_2_level->ID];
//$level_1_childs[$single_2_level->ID] = $single_2_level->post_title;
$all_sub_childs = $wpdb->get_results( $wpdb->prepare( "SELECT ID, post_title FROM {$wpdb->posts} WHERE post_parent = %d amp;amp; post_type= 'page' amp;amp; post_status='publish' ", $single_2_level->ID ) );
$level_2_childs = [];
foreach( $all_sub_childs as $single_3_level ){
$level_2_childs[$single_3_level->ID] = ['title' => $single_3_level->post_title, 'ID' => $single_3_level->ID];
}
//var_dump( $level_1_childs );
$level_1_childs[$single_2_level->ID]['childs'] = $level_2_childs;
//var_dump( $level_1_childs );
}
$tree_data[$page_id]['childs'] = $level_1_childs;
//var_dump( $tree_data );
return $tree_data;
}
Ответ №1:
Вам нужно перейти ORDER BY {$wpdb->posts}.menu_order ASC
к вашему запросу. проверьте приведенный ниже код.
function wph_get_page_tree( $page_id ){
global $wpdb;
$tree_data = [];
$tree_data[$page_id] = ['title' => get_post($page_id)->post_title, 'ID' => $page_id];
// get 1 level childs
$level_1_childs = [];
$all_childs = $wpdb->get_results( $wpdb->prepare( "SELECT ID, post_title FROM {$wpdb->posts} WHERE post_parent = %d amp;amp; post_type= 'page' amp;amp; post_status='publish' ORDER BY {$wpdb->posts}.menu_order ASC ", $page_id ) );
foreach( $all_childs as $single_2_level ){
$level_1_childs[$single_2_level->ID] = ['title' => $single_2_level->post_title, 'ID' => $single_2_level->ID];
//$level_1_childs[$single_2_level->ID] = $single_2_level->post_title;
$all_sub_childs = $wpdb->get_results( $wpdb->prepare( "SELECT ID, post_title FROM {$wpdb->posts} WHERE post_parent = %d amp;amp; post_type= 'page' amp;amp; post_status='publish' ORDER BY {$wpdb->posts}.menu_order ASC ", $single_2_level->ID ) );
$level_2_childs = [];
foreach( $all_sub_childs as $single_3_level ){
$level_2_childs[$single_3_level->ID] = ['title' => $single_3_level->post_title, 'ID' => $single_3_level->ID];
}
//var_dump( $level_1_childs );
$level_1_childs[$single_2_level->ID]['childs'] = $level_2_childs;
//var_dump( $level_1_childs );
}
$tree_data[$page_id]['childs'] = $level_1_childs;
//var_dump( $tree_data );
return $tree_data;
}
Комментарии:
1. Спасибо! Это отлично сработало и помогло мне понять, как реализовать дополнительные функции, если это необходимо. Действительно ценю это. Я уже начал зацикливаться на
{$wpdb->posts}.menu_order
2. Добро пожаловать… рад быть вам полезным.