Вопрос или проблема
У меня есть meta_key с именем “_ordre”, и каждый раз, когда я создаю новый пользовательский пост, для этого meta_key устанавливается новое значение meta_value.
Дело в том, что, когда я устанавливаю значение ‘_ordre’ в 0, meta_value не сохраняется в базе данных. Все остальное работает, но 0.
Вот мой код:
function wp_audio_save_meta( $post_id, $post )
{
if ( defined( 'DOING_AUTOSAVE' ) && DOING_AUTOSAVE )
return;
if ( !isset( $_POST['wp_audio_posts_nonce'] ) )
return;
if ( !wp_verify_nonce( $_POST['wp_audio_posts_nonce'], plugin_basename( __FILE__ ) ) )
return;
if ( !current_user_can( 'edit_post', $post->ID ) )
return;
if ( $post->post_type == 'revision' )
return;
$value = $_POST['_ordre'];
if ( get_post_meta( $post->ID, '_ordre', FALSE ) )
{
update_post_meta( $post->ID, '_ordre', $value );
}
else
{
add_post_meta( $post->ID, '_ordre', $value );
};
if ( !$value ) delete_post_meta( $post->ID, '_ordre' );
}
add_action( 'save_post', 'wp_audio_save_meta', 1, 2 );
Любая помощь будет оценена. Спасибо.
ИЗМЕНЕНИЕ:
var_dump($_POST):
array(56)
{
["_wpnonce"]=> string(10) "f874332a30"
["_wp_http_referer"]=> string(44) "/admin/wp-admin/post-new.php?post_type=audio"
["user_ID"]=> string(1) "2"
["action"]=> string(8) "editpost"
["originalaction"]=> string(8) "editpost"
["post_author"]=> int(2)
["post_type"]=> string(5) "audio"
["original_post_status"]=> string(10) "auto-draft"
["referredby"]=> string(40) "http://www.xxx.com/admin/wp-admin/"
["_wp_original_http_referer"]=> string(40) "http://www.xxx.com/admin/wp-admin/"
["auto_draft"]=> string(1) "1"
["post_ID"]=> string(4) "1539"
["autosavenonce"]=> string(10) "f9cf5bed77"
["meta-box-order-nonce"]=> string(10) "629f95f577"
["closedpostboxesnonce"]=> string(10) "b121fed9eb"
["post_title"]=> string(0) ""
["samplepermalinknonce"]=> string(10) "96f452a929"
["post_category"]=> array(1) { [0]=> string(1) "0" }
["newcategory"]=> string(29) "Новое имя категории"
["newcategory_parent"]=> string(2) "-1"
["_ajax_nonce-add-category"]=> string(10) "411da663fa"
["wp_custom_audio_file_noncename"]=> string(10) "584d7b259e"
["xxx"]=> string(4) "1539"
["title_up_1"]=> string(0) ""
["wp_audio_posts_nonce"]=> string(10) "584d7b259e"
["_ordre"]=> string(1) "0"
["post_name"]=> string(0) ""
["wp-preview"]=> string(0) ""
["hidden_post_status"]=> string(5) "draft"
["post_status"]=> string(7) "publish"
["hidden_post_password"]=> string(0) ""
["hidden_post_visibility"]=> string(6) "public"
["visibility"]=> string(6) "public"
["post_password"]=> string(0) ""
["jj"]=> string(2) "03"
["mm"]=> string(2) "02"
["aa"]=> string(4) "2013"
["hh"]=> string(2) "15"
["mn"]=> string(2) "03"
["ss"]=> string(2) "28"
["hidden_mm"]=> string(2) "02"
["cur_mm"]=> string(2) "02"
["hidden_jj"]=> string(2) "03"
["cur_jj"]=> string(2) "03"
["hidden_aa"]=> string(4) "2013"
["cur_aa"]=> string(4) "2013"
["hidden_hh"]=> string(2) "15"
["cur_hh"]=> string(2) "15"
["hidden_mn"]=> string(2) "03"
["cur_mn"]=> string(2) "03"
["original_publish"]=> string(7) "Опубликовать"
["publish"]=> string(7) "Опубликовать"
["post_mime_type"]=> string(0) ""
["ID"]=> int(1539)
["comment_status"]=> string(6) "closed"
["ping_status"]=> string(6) "closed"
}
if ( !$value )
принимает значение TRUE
, когда значение равно 0
.
Альтернатива:
if ( ! isset ( $_POST['_ordre'] ) )
return delete_post_meta( $post_id, '_ordre' );
update_post_meta( $post_id, '_ordre', $_POST['_ordre'] );
Вам не нужно add_post_meta()
, вызов update_post_meta()
сделает это автоматически.
Ответ или решение
Сохранение нуля в качестве мета-значения в WordPress
Введение
Работа с пользовательскими полями в WordPress может быть непростой, особенно когда дело доходит до сохранения мета-значений, таких как '_ordre'
. В данной ситуации возникла проблема, при которой значение 0
не сохраняется в базе данных. Поэтому важно разобраться, как корректно обрабатывать нулевые значения и обеспечить их сохранение.
Проблема
Ваша функция для сохранения метаданных позволяет записывать значения, но возникают проблемы, когда мета-значение равно 0
. Проблема кроется в следующем условии:
if ( !$value ) delete_post_meta( $post->ID, '_ordre' );
В этом условии проверяется, является ли значение пустым. Так как 0
в PHP интерпретируется как ложное значение (false), условие срабатывает, и происходит удаление мета-значения.
Решение
Чтобы исправить данную проблему, необходимо изменить условие проверки на наличие значения. Вместо проверки на пустоту (!$value
), стоит проверить, установлено ли значение:
if ( ! isset( $_POST['_ordre'] ) ) {
delete_post_meta( $post_id, '_ordre' );
return;
}
Таким образом, если значение '_ordre'
отсутствует (что означает, что поле не было отправлено), то мета-значение будет удалено. Однако, если значение равно 0
, оно будет правильно обработано и сохранено, так как условие больше не будет удалять значение.
Улучшение кода
Также важно оптимизировать сам процесс сохранения. Вместо использования add_post_meta()
и update_post_meta()
, последняя функция сама по себе может обработать как обновление, так и добавление мета-значения. Приведенный ниже код подойдёт для вашей задачи:
function wp_audio_save_meta( $post_id, $post )
{
if ( defined( 'DOING_AUTOSAVE' ) && DOING_AUTOSAVE ) return;
if ( !isset( $_POST['wp_audio_posts_nonce'] ) ) return;
if ( !wp_verify_nonce( $_POST['wp_audio_posts_nonce'], plugin_basename( __FILE__ ) ) ) return;
if ( !current_user_can( 'edit_post', $post->ID ) ) return;
if ( $post->post_type == 'revision' ) return;
// Получаем значение из POST
$value = isset( $_POST['_ordre'] ) ? $_POST['_ordre'] : null;
// Если значение не null, обновляем его
if ( !is_null( $value ) ) {
update_post_meta( $post_id, '_ordre', $value );
} else {
delete_post_meta( $post_id, '_ordre' );
}
}
add_action( 'save_post', 'wp_audio_save_meta', 1, 2 );
Заключение
Сохраняя значение 0
как мета-значение в WordPress, важно учитывать, как система обрабатывает ложные значения. Изменив логику проверки и упростив код, вы сможете успешно управлять мета-значениями, включая нуль. Следуя вышеизложенному, у вас не будет проблем с сохранением любого значения, включая 0
.
Рекомендуем сохранять актуальность вашего кода, регулярно проверяя его на работоспособность и эффективность, а также следя за обновлениями системы WordPress.