Почему не присваивается родительская страница, при создании дочерней страницы через POST запрос?

Ссылка скопирована
1 ответ

Опубликую страницу (тип 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');

Дополнительно:

Почему не присваивается родительская страница, при создании дочерней страницы через POST запрос?

Возможно, в условии проблема, "
if ($language !== 'ru') {
$page['post_parent'] = $parent_page_id;
}

У тебя тут ответ, если не "ru", попробуй добавить ещё и если не "en".
***
P.S. В целом, рекомендую использовать framework CodeIgniter 4, там есть возможность с коробки использовать локализацию и очень удобно к тому же весь нужный функционал есть там.

Нужно решить такую задачу?

Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.

Заказать помощь
Лучший ответ
1
Игорь NetOps Ответ

Родительская страница в 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());
}

$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;

$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.

Другие ответы (0)

Пока нет других ответов. Будьте первым, кто поможет автору.

Ответить на вопрос

комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Вам также может быть интересно