Бесконечный цикл в pre_get_posts при фильтрации страниц в администраторе WordPress ⇐ Php
-
Гость
Бесконечный цикл в pre_get_posts при фильтрации страниц в администраторе WordPress
Мне удалось добавить раскрывающиеся списки в фильтры, доступные для страниц в администраторе WordPress.
В списке отображаются только корневые страницы.
Когда я выбираю корневую страницу и нажимаю фильтр, я хочу отобразить все страницы, находящиеся под этой корневой страницей.
У меня есть этот код в файле function.php, но он зацикливается, и мне не удалось это исправить. Любая помощь приветствуется.
// добавляем фильтр в списки в админке add_action( 'pre_get_posts', 'kpcms_filter_pages_request'); функция kpcms_filter_pages_request( $запрос) { // добавляем фильтр в список обучающих страниц в администраторе если ((strpos( $_SERVER['REQUEST_URI'], '/wp-admin/edit.php') !== false) && isset( $_GET['admin_filter_KPCMS_training'])) { если (! пусто( $_GET['admin_filter_KPCMS_training'])) { журнал ошибок( 'добавлять фильтры по обучению'); add_filter( 'сообщения_где', 'kpcms_filter_pages_by_training', 10, 1); } } } функция kpcms_filter_pages_by_training( $где = '') { $where .= 'И wp_' . get_current_blog_id() . '_posts.ID IN(' . $_GET['admin_filter_KPCMS_training']; $childPages = json_decode( "[" . подстр( kpcms_get_child_posts_JSON( "страница", $_GET['admin_filter_KPCMS_training'], [], истинный, множество( "публиковать", "будущее", "черновик" )), 1) . "]", истинный); foreach ($childPages как $childPage) { $where .= "," . $childPage['id']; } $where .= ")"; // Удаляем фильтр для вызова этой функции, так как она нам больше не нужна удалить_фильтр( 'сообщения_где', 'kpcms_filter_pages_by_training', 10, 1); вернуть $где; } // получаем иерархический массив идентификаторов и заголовков всех подстраниц текущей страницы функция kpcms_get_child_posts_JSON( $посттипе, $postId, $array_saved_pages, $first_call, $postStatus = массив( "публиковать" )) { $searchTags = [ "\\", '"', "\р\н" ]; $replaceTags = [ "\\\\", '\\"', "" ]; статические $child_Pages; // если сначала вызвать пустую $child_Pages если ($first_call) { $child_Pages = ''; } $args = массив( 'post_type' => $postType, 'post_status' => $postStatus, 'sort_order' => 'по возрастанию', 'sort_column' => 'menu_order', 'родитель' => $postId ); $дети = get_pages( $аргс); если ($дети !== ложь) { foreach ($children как $child) { если (in_array( $child->ID, $array_saved_pages)) { $selectedState = ', "состояние": { "выбрано": "ИСТИНА" }'; } еще { $selectedState = ""; } $child_Pages .= ',{"id" : ' . $ребенок->ID . ', "parent": "'. $postId. '", "text": "'. str_replace( $searchTags, $replaceTags, $child->post_title). '"' . $selectedState . '}'; kpcms_get_child_posts_JSON( $посттипе, $child->ID, $array_saved_pages, ЛОЖЬ, $постстатус); // третий аргумент имеет значение false для заполнения $child_Pages } } вернуть $child_Pages; }
Мне удалось добавить раскрывающиеся списки в фильтры, доступные для страниц в администраторе WordPress.
В списке отображаются только корневые страницы.
Когда я выбираю корневую страницу и нажимаю фильтр, я хочу отобразить все страницы, находящиеся под этой корневой страницей.
У меня есть этот код в файле function.php, но он зацикливается, и мне не удалось это исправить. Любая помощь приветствуется.
// добавляем фильтр в списки в админке add_action( 'pre_get_posts', 'kpcms_filter_pages_request'); функция kpcms_filter_pages_request( $запрос) { // добавляем фильтр в список обучающих страниц в администраторе если ((strpos( $_SERVER['REQUEST_URI'], '/wp-admin/edit.php') !== false) && isset( $_GET['admin_filter_KPCMS_training'])) { если (! пусто( $_GET['admin_filter_KPCMS_training'])) { журнал ошибок( 'добавлять фильтры по обучению'); add_filter( 'сообщения_где', 'kpcms_filter_pages_by_training', 10, 1); } } } функция kpcms_filter_pages_by_training( $где = '') { $where .= 'И wp_' . get_current_blog_id() . '_posts.ID IN(' . $_GET['admin_filter_KPCMS_training']; $childPages = json_decode( "[" . подстр( kpcms_get_child_posts_JSON( "страница", $_GET['admin_filter_KPCMS_training'], [], истинный, множество( "публиковать", "будущее", "черновик" )), 1) . "]", истинный); foreach ($childPages как $childPage) { $where .= "," . $childPage['id']; } $where .= ")"; // Удаляем фильтр для вызова этой функции, так как она нам больше не нужна удалить_фильтр( 'сообщения_где', 'kpcms_filter_pages_by_training', 10, 1); вернуть $где; } // получаем иерархический массив идентификаторов и заголовков всех подстраниц текущей страницы функция kpcms_get_child_posts_JSON( $посттипе, $postId, $array_saved_pages, $first_call, $postStatus = массив( "публиковать" )) { $searchTags = [ "\\", '"', "\р\н" ]; $replaceTags = [ "\\\\", '\\"', "" ]; статические $child_Pages; // если сначала вызвать пустую $child_Pages если ($first_call) { $child_Pages = ''; } $args = массив( 'post_type' => $postType, 'post_status' => $postStatus, 'sort_order' => 'по возрастанию', 'sort_column' => 'menu_order', 'родитель' => $postId ); $дети = get_pages( $аргс); если ($дети !== ложь) { foreach ($children как $child) { если (in_array( $child->ID, $array_saved_pages)) { $selectedState = ', "состояние": { "выбрано": "ИСТИНА" }'; } еще { $selectedState = ""; } $child_Pages .= ',{"id" : ' . $ребенок->ID . ', "parent": "'. $postId. '", "text": "'. str_replace( $searchTags, $replaceTags, $child->post_title). '"' . $selectedState . '}'; kpcms_get_child_posts_JSON( $посттипе, $child->ID, $array_saved_pages, ЛОЖЬ, $постстатус); // третий аргумент имеет значение false для заполнения $child_Pages } } вернуть $child_Pages; }
Мобильная версия