Вопрос или проблема
Я пытаюсь вставить запись, когда пользователь (то есть я) нажимает кнопку (эта кнопка находится внутри мета-бокса на панели управления администратора). Это не происходит, и я не знаю почему. Когда я помещаю содержимое своей функции прямо на страницу php, запись вставляется. Но внутри функции код, похоже, ничего не делает.
Мой PHP
add_action('wp_dashboard_setup', 'schedule_synopsissen_setup');
function schedule_synopsissen_setup() {
wp_add_dashboard_widget('schedule-synopsissen', 'Synopsissen maken', 'schedule_synopsissen_content');
}
function schedule_synopsissen_content() {
?><form action="index.php" method="post">
<input type="submit" name="synopis_schedule" value="Synopsis maken" />
</form>
<?php
if($_SERVER['REQUEST_METHOD'] == "POST" and isset($_POST['synopis_schedule'])) { schedule_synopsissen(); echo '<br>De synposis werd aangemaakt!'; }
}
function schedule_synopsissen() {
global $wpdb;
$result = array(
$wpdb->get_results( "SELECT * FROM {$wpdb->prefix}synopsis WHERE `episodeShow` LIKE 'Familie' AND `firstAired` LIKE '" . date("Y-m-d", strtotime(date('Y') . "-W" . (date('W') + 1). "-1")) . "'", 'ARRAY_A' )[0],
$wpdb->get_results( "SELECT * FROM {$wpdb->prefix}synopsis WHERE `episodeShow` LIKE 'Familie' AND `firstAired` LIKE '" . date("Y-m-d", strtotime(date('Y') . "-W" . (date('W') + 1). "-2")) . "'", 'ARRAY_A' )[0],
$wpdb->get_results( "SELECT * FROM {$wpdb->prefix}synopsis WHERE `episodeShow` LIKE 'Familie' AND `firstAired` LIKE '" . date("Y-m-d", strtotime(date('Y') . "-W" . (date('W') + 1). "-3")) . "'", 'ARRAY_A' )[0],
$wpdb->get_results( "SELECT * FROM {$wpdb->prefix}synopsis WHERE `episodeShow` LIKE 'Familie' AND `firstAired` LIKE '" . date("Y-m-d", strtotime(date('Y') . "-W" . (date('W') + 1). "-4")) . "'", 'ARRAY_A' )[0],
$wpdb->get_results( "SELECT * FROM {$wpdb->prefix}synopsis WHERE `episodeShow` LIKE 'Familie' AND `firstAired` LIKE '" . date("Y-m-d", strtotime(date('Y') . "-W" . (date('W') + 1). "-5")) . "'", 'ARRAY_A' )[0],
);
$post_excerpt = $result[0]['weekExcerpt'];
$post_content="<p>" . $post_excerpt . '</p>';
foreach ($result as $day) {
$post_content .= '
<h2>' . ucfirst(strftime('%A %e %B %Y', strtotime($day['firstAired']))) . ' (aflevering <div class="tooltip">' . $day['airedEpisode'] . '<span class="tooltip-content">aflevering ' . $day['airedEpisode'] . '<br>van seizoen ' . $day['airedSeason'] . '</span></div> / <div class="tooltip">' . $day['absoluteNumber'] . '<span class="tooltip-content">de ' . $day['absoluteNumber'] . 'e aflevering<br> van Familie</span></div>)
</h2>
' . $day['episodeSynopsis'];
}
if ( strftime('%B', strtotime($result[0]['firstAired'])) !== strftime('%B', strtotime($result[0]['firstAired']))) {
$post_title_month=" " . strftime('%e', strtotime($result[0]['firstAired']));
}
$post_title="SYNOPSIS | " . $result[0]['episodeShow'] . ': ' . strftime('%e', strtotime($result[0]['firstAired'])) . $post_title_month . ' - ' . strftime('%e', strtotime($result[4]['firstAired'])) . ' ' . strftime('%B', strtotime($result[4]['firstAired']));
wp_insert_post (array(
'post_author' => 1,
'post_date' => strtotime(date('Y') . "-W" . (date('W')). "-5") + 75600,
'post_content' => $post_content,
'post_title' => $post_title,
'post_excerpt' => $post_excerpt,
'post_status' => 'publish',
'post_type' => 'televisie',
'tax_input' => array(
"programmas" => $result[0]['episodeShow'],
"zenders" => switchShow( $result[0]['episodeShow'] ),
),
'meta_input' => array(
"layout" => 'synopsis',
"checkboxes-infobox" => 'on',
"checkboxes-time" => 'on',
"checkboxes-summary" => 'on',
"_thumbnail_id" => $result[0]['weekId'],
),
), true );
}
Я рекомендую изменить тег формы на:
Это гарантирует, что форма отправится на ту же страницу, на которой она находится.
Также post_title и post_content обязательны, поэтому вставка завершится неудачей, если любое из этих значений пусто или отсутствует. (https://developer.wordpress.org/reference/functions/wp_insert_post/)
Ответ или решение
Проблема, с которой вы столкнулись при использовании функции wp_insert_post
в WordPress, может возникать по нескольким причинам. Распишем процесс от теории до практических решений, чтобы вы могли лучше понять и устранить вашу проблему.
Теория
Функция wp_insert_post
используется в WordPress для программного добавления новых постов в базу данных. Обычно она принимает массив параметров, таких как post_title
, post_content
, post_status
, и другие, причём некоторые из них обязательны. Несмотря на то, что процесс добавления поста может казаться простым, существует ряд нюансов, которые могут помешать успешному выполнению задачи:
- Валидация данных: Некоторые поля, такие как
post_title
иpost_content
, являются обязательными. Если одно из них отсутствует или имеет пустое значение, запись не будет добавлена. - Контекст выполнения: Код, выполняемый в различных контекстах WordPress, может иметь разные разрешения доступа и доступ к базам данных. Например, код, который работает в глобальном контексте, может не работать в функции, прикреплённой к хукам.
- Ошибки PHP: Любые ошибки в вашей PHP-логике могут привести к прерыванию выполнения скрипта, даже если ошибки незаметны на первый взгляд.
Пример
Ваш текущий код использует wp_dashboard_setup
для добавления функции назначения контента в метабокс в админ-панели. Ваша функция, отвечающая за вставку поста, (schedule_synopsissen)
, вызывается на основе отправки формы:
if($_SERVER['REQUEST_METHOD'] == "POST" and isset($_POST['synopis_schedule'])) {
schedule_synopsissen();
echo '<br>De synposis werd aangemaakt!';
}
Это логика вызывается только при выявлении отправки формы методом POST и наличии конкретного поля в массиве $_POST
. Основные замечания по этому коду:
-
Метод формы и цель: Убедитесь, что форма отправляется правильно на ту же страницу или на обработчик, который может корректно среагировать на данные. Рекомендуется использовать
action
формы, чтобы он был пустым или равным<?php echo htmlspecialchars($_SERVER["PHP_SELF"]); ?>
, так как текущая конфигурация делаетaction="index.php"
. -
Проверка данных: Убедитесь, что все используемые поля, такие как
post_title
иpost_content
, действительно не пусты перед вызовомwp_insert_post
. -
Ошибки функции
wp_insert_post
: ИспользуйтеWP_Error
для отлова ошибок, возвращаемыхwp_insert_post
. Убедитесь, что вызов функции не блокируется по этим причинам.
Применение
Для исправления вашей проблемы, вот шаги, которые я рекомендую выполнить:
- Проверка входных данных: Прежде чем продолжать, добавьте проверки на существование необходимых данных:
$post_title = !empty($post_title) ? $post_title : 'Default Title';
$post_content = !empty($post_content) ? $post_content : 'Content cannot be empty';
-
Удаление всех синтаксических ошибок: Убедитесь, что каждая часть вашего PHP-кода правильно закрыта и открыта. В вашем текущем коде есть структуры, которые могут быть ошибочно интерпретированы из-за некорректного закрытия тегов.
-
Корректировка вызовов к базе данных: Проверьте возвращаемые записи из базы данных. Если
get_results
возвращает пустой массив или ошибки, это может быть связано с некорректными SQL-запросами. Удостоверьтесь, что таблицы и поля существуют и данные есть в таблице:
$wpdb->get_results( "SELECT * FROM {$wpdb->prefix}synopsis WHERE ... " );
-
Логгирование ошибок: Напишите функции логгирования, которые будут помогать выявлять ошибки PHP и WordPress. Используйте инструмент отладки, такой как
error_log
, для регистрации ошибок. -
Поддержание отладки: Оставьте отладочные выводы в браузере или гибкие выводы на экран, чтобы иметь представление о том, какие шаги проходят успешно, а какие — нет. Это может быть реализация с эквивалентом:
echo '<pre>'; print_r($result); echo '</pre>';
После осуществления всех вышеизложенных рекомендаций, ваш код, вероятно, начнет корректно вставлять записи в базу данных. Если проблема все еще сохраняется, наличие подробных логов и сообщений об ошибках поможет вам, или может быть вашим коллегам, быстрее выявить и устранить причину сбоя.