Почему не присваивается родительская страница, при создании дочерней страницы через POST запрос?
Опубликую страницу (тип page) на моем WP сайте .
Это я делаю путем отправки POST запроса на мой сайт.
Добавил в файл functions.php на моей WP темы код (см ниже), который принимает данные от post запроса и создает с этими данными страницу (тип page).
Страница нормально создаётся если я в переменой VZIALI_ODIN_JAZIK передаю значение ru, и страница создаётся такая: https://t********n.ru/news9999
НО! Если в переменой VZIALI_ODIN_JAZIK передаю значение например en то страница не создаётся вообще, хотя статут ответа от POST запроса приходит 200.
Хотя в коде я указал что если в VZIALI_ODIN_JAZIK стоят данные отличные от ru, то нужно создать дочернюю страницу присвоив ей эту родительскую страницу https://t********n.ru/en/ (у родительской страницы такой id: 42673) и вроде создаваемая страница должна создастся с таким url: https://t********n.ru/en/news9999
Вопрос: Почему при создании дочерней страницы ей не присваивается родительская страница?
Код в файле functions.php который за это отвечает:
// Определение пароля для проверки запросов $my_special_password = "F6f*****СкрылДляВопроса*******0tf"; // ID родительской страницы $parent_page_id = 42673; // Функция для проверки пароля function check_request_password() { global $my_special_password; if (isset($_REQUEST['password']) && $_REQUEST['password'] === $my_special_password) { return true; } return false; } // Функция для создания страницы function create_translated_page() { global $parent_page_id; // Используем глобальную переменную if (!check_request_password()) { return; } $title = isset($_REQUEST['A_TITLE']) ? $_REQUEST['A_TITLE'] : 'No Title'; $content = "<br><br><br><img rel='preload' as='image' title='{$_REQUEST['PODPIS_TITILE_DLA_KARTINKI_DLA_INDEX_YANDEX_GOOGLE']}' src='https://t***СкрылДляВопроса***n.ru/all_webp_images/{$_REQUEST['G_PRISTAVKA_DLA_WEBP_KARTINKI']}' alt='{$_REQUEST['PODPIS_TITILE_DLA_KARTINKI_DLA_INDEX_YANDEX_GOOGLE']}' rel='nofollow' width='675' height='{$_REQUEST['IMAGE_HEIGHT']}' class='alignnone size-medium' /> <br><br> {$_REQUEST['TEXT_BOLSHOY_STATIY']}"; $language = isset($_REQUEST['VZIALI_ODIN_JAZIK']) ? strtolower(trim(strval($_REQUEST['VZIALI_ODIN_JAZIK']))) : ''; $url_end = isset($_REQUEST['E_PRISTAVKA_K_URL_NEWS_ZIFRA']) ? $_REQUEST['E_PRISTAVKA_K_URL_NEWS_ZIFRA'] : ''; // Формируем конечный URL $full_page_slug = $url_end; $page = array( 'post_title' => $title, 'post_content' => $content, 'post_status' => 'publish', 'post_type' => 'page', 'post_name' => $full_page_slug, ); // Если язык не 'ru', устанавливаем родительскую страницу if ($language !== 'ru') { $page['post_parent'] = $parent_page_id; } // Создание страницы и логирование возможных ошибок $result = wp_insert_post($page, true); if (is_wp_error($result)) { error_log($result->get_error_message()); } } // Добавляем функцию create_translated_page к инициализации WordPress add_action('init', 'create_translated_page'); |
// Определение пароля для проверки запросов $my_special_password = "F6f*****СкрылДляВопроса*******0tf"; // ID родительской страницы $parent_page_id = 42673; // Функция для проверки пароля function check_request_password() { global $my_special_password; if (isset($_REQUEST['password']) && $_REQUEST['password'] === $my_special_password) { return true; } return false; } // Функция для создания страницы function create_translated_page() { global $parent_page_id; // Используем глобальную переменную if (!check_request_password()) { return; } $title = isset($_REQUEST['A_TITLE']) ? $_REQUEST['A_TITLE'] : 'No Title'; $content = "<br><br><br><img rel='preload' as='image' title='{$_REQUEST['PODPIS_TITILE_DLA_KARTINKI_DLA_INDEX_YANDEX_GOOGLE']}' src='https://t***СкрылДляВопроса***n.ru/all_webp_images/{$_REQUEST['G_PRISTAVKA_DLA_WEBP_KARTINKI']}' alt='{$_REQUEST['PODPIS_TITILE_DLA_KARTINKI_DLA_INDEX_YANDEX_GOOGLE']}' rel='nofollow' width='675' height='{$_REQUEST['IMAGE_HEIGHT']}' class='alignnone size-medium' /> <br><br> {$_REQUEST['TEXT_BOLSHOY_STATIY']}"; $language = isset($_REQUEST['VZIALI_ODIN_JAZIK']) ? strtolower(trim(strval($_REQUEST['VZIALI_ODIN_JAZIK']))) : ''; $url_end = isset($_REQUEST['E_PRISTAVKA_K_URL_NEWS_ZIFRA']) ? $_REQUEST['E_PRISTAVKA_K_URL_NEWS_ZIFRA'] : ''; // Формируем конечный URL $full_page_slug = $url_end; $page = array( 'post_title' => $title, 'post_content' => $content, 'post_status' => 'publish', 'post_type' => 'page', 'post_name' => $full_page_slug, ); // Если язык не 'ru', устанавливаем родительскую страницу if ($language !== 'ru') { $page['post_parent'] = $parent_page_id; } // Создание страницы и логирование возможных ошибок $result = wp_insert_post($page, true); if (is_wp_error($result)) { error_log($result->get_error_message()); } } // Добавляем функцию create_translated_page к инициализации WordPress add_action('init', 'create_translated_page');
Дополнительно:
Возможно, в условии проблема, "
if ($language !== 'ru') {
$page['post_parent'] = $parent_page_id;
}
У тебя тут ответ, если не "ru", попробуй добавить ещё и если не "en".
***
P.S. В целом, рекомендую использовать framework CodeIgniter 4, там есть возможность с коробки использовать локализацию и очень удобно к тому же весь нужный функционал есть там.
Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.
Пока нет других ответов. Будьте первым, кто поможет автору.
Ответить на вопрос

Родительская страница в WordPress присваивается не через URL и не через язык, а через поле
post_parentпри создании записи типаpage. Если дочерняя страница не создаётся, почти всегда проблема в одном из трёх мест: вы передаёте неправильный ID родителя, родительская страница ещё не существует, либо языковой плагин перехватывает создание страницы и требует дополнительной привязки языка.Минимальный корректный пример:
$parent_id = 123; // ID родительской страницы $post_id = wp_insert_post([ 'post_type' => 'page', 'post_status' => 'publish', 'post_title' => sanitize_text_field($_POST['title'] ?? ''), 'post_name' => sanitize_title($_POST['slug'] ?? ''), 'post_content' => wp_kses_post($_POST['content'] ?? ''), 'post_parent' => $parent_id, ], true); if (is_wp_error($post_id)) { error_log($post_id->get_error_message()); }
Важно:
post_parentдолжен быть числом, а не ссылкой и не slug. Перед вставкой проверьте, что родитель найден:$parent = get_page_by_path('en'); if (!$parent) { error_log('Parent page not found'); return; } $parent_id = (int) $parent->ID;
Если используется WPML/Polylang, обычного
post_parentможет быть мало. Нужно создать страницу в нужном языке и связать её с переводами через API конкретного плагина. Иначе WordPress вставляет страницу, но языковой фильтр может не показывать её на фронте или возвращать не тот родительский раздел.Ещё одна ошибка в подобных обработчиках — принимать POST прямо в
functions.phpбез нормального endpoint. Лучше сделать REST route илиadmin_post, проверить nonce/токен, права доступа и логировать входные данные. Тогда будет понятно, что именно пришло вVZIALI_ODIN_JAZIKи какой ID родителя реально передаётся вwp_insert_post.