Вопрос или проблема
Я пытаюсь написать плагин, который будет загружать PDF-файлы с определенного URL, но метаполе не сохраняется. Вот мой код:
<?php
/*
Имя плагина: Пользовательская загрузка PDF
URI плагина: http://example.com/
Описание: Позволяет администраторам загружать PDF-файлы, а пользователям скачивать их с проверкой reCAPTCHA.
Версия: 1.0
Автор: Ваше имя
URI автора: http://example.com/
Лицензия: GPLv2 или выше
Текстовый домен: custom-pdf-upload
*/
// Создать пользовательский тип записи для PDF
function create_pdf_post_type() {
register_post_type( 'pdf', array(
'labels' => array(
'name' => 'PDF-файлы',
'singular_name' => 'PDF-файл',
),
'public' => false,
'show_ui' => true,
'has_archive' => false,
'supports' => array( 'title', 'editor', 'thumbnail' ),
) );
}
add_action( 'init', 'create_pdf_post_type' );
// Добавить пользовательское поле для URL PDF-файла
function add_pdf_url_field( $post_id ) {
if ( get_post_type( $post_id ) == 'pdf' ) {
echo '<label for="pdf_url">URL PDF:</label>';
echo '<input type="text" id="pdf_url" name="pdf_url">';
}
}
add_action( 'edit_form_after_editor', 'add_pdf_url_field' );
function save_pdf_url( $post_id ) {
if ( isset( $_POST['pdf_url'] ) && !empty( $_POST['pdf_url'] ) ) {
update_post_meta( $post_id, 'pdf_file_url', $_POST['pdf_url'] );
}
}
add_action( 'save_post', 'save_pdf_url' );
Мой пользовательский тип записи создан, и есть метаполе под моим разделом содержимого, но когда я ввожу что-то в поле и нажимаю сохранить, страница редактирования обновляется, и URL не сохраняется. Однако содержимое сохраняется.
Ответ или решение
Ваш вопрос о том, почему метаполе в вашем плагине не сохраняется в базе данных, может быть связан с несколькими важными аспектами кода и процесса сохранения метаданных в WordPress. Рассмотрим возможные причины проблемы и предоставим рекомендации по их устранению.
1. Проблемы с проверкой прав доступа
Одной из распространенных причин, по которой данные не сохраняются, является отсутствие проверки прав доступа. Ваша функция сохранения метаполя должна удостовериться, что пользователь обладает правами редактирования поста. Добавьте следующий код в начало функции save_pdf_url
:
if ( ! current_user_can( 'edit_post', $post_id ) ) {
return;
}
2. Проверка актуальности данных
WordPress использует механизм проверки актуальности запросов для защиты от атак. Ваша функция сохранения метаданных должна также проверять наличие и корректность nonce-параметра. Добавьте nonce в форму и проверьте его перед сохранением:
Вставьте nonce в форму:
function add_pdf_url_field( $post_id ) {
if ( get_post_type( $post_id ) == 'pdf' ) {
wp_nonce_field( 'pdf_url_nonce_action', 'pdf_url_nonce' );
echo '<label for="pdf_url">PDF URL:</label>';
echo '<input type="text" id="pdf_url" name="pdf_url">';
}
}
Проверьте nonce перед сохранением:
function save_pdf_url( $post_id ) {
if ( ! isset( $_POST['pdf_url_nonce'] ) || ! wp_verify_nonce( $_POST['pdf_url_nonce'], 'pdf_url_nonce_action' ) ) {
return;
}
if ( ! current_user_can( 'edit_post', $post_id ) ) {
return;
}
if ( isset( $_POST['pdf_url'] ) && ! empty( $_POST['pdf_url'] ) ) {
update_post_meta( $post_id, 'pdf_file_url', sanitize_text_field( $_POST['pdf_url'] ) );
}
}
3. Санитация входных данных
При сохранении пользовательских данных важно использовать функции санитации. В коде вы можете заметить, что данные сохраняются без предварительной обработки. Мы использовали sanitize_text_field()
для фильтрации URL перед сохранением, что обязательно для повышения безопасности и предотвращения возможных уязвимостей.
4. Опции отображения и доступность метаполя
Проверьте, что ваш метаполе правильно отображается на экране редактирования поста. Также убедитесь, что вы добавили нужные настройки для вашей пользовательской записи. Эти аспекты влияют на сохранение данных, и необходимо удостовериться, что интерфейс правильно инициализирован.
5. Логи и отладка
Если код выше не решает проблему, рекомендуется включить отладочные логи в вашем WordPress с помощью:
define( 'WP_DEBUG', true );
define( 'WP_DEBUG_LOG', true );
Проверьте файл debug.log
в директории /wp-content/
, чтобы найти ошибки, связанные с сохранением метаполей.
Заключение
Следуя приведенным рекомендациям, вы сможете устранить проблему с сохранением метаполя в вашей пользовательской записи PDF. Убедитесь в правильности каждой из рекомендаций и протестируйте функционал, после чего сохранение должно заработать должным образом. Если проблема сохраняется, рассмотрите возможность обращения за помощью на специализированные форумы по WordPress или к сообществу разработчиков.