Условная логика для метабоксов CMB2
Я использую CMB2 для метабоксов на пользовательских записях. Я добавляю метабокс с помощью следующего кода:
$cmb_demo->add_field( array(
'name' => __( 'Test Text', 'cmb2' ), // Название текстового поля
'desc' => __( 'field description (optional)', 'cmb2' ), // Описание поля (необязательно)
'id' => $prefix . 'text', // Идентификатор поля
'type' => 'text', // Тип поля
'show_on_cb' => 'show_this_field_if_true', // Функция для условного отображения
) );
Я понимаю, что show_this_field_if_true будет функцией, возвращающей true или false. Но я хочу сделать это условие зависимым от другого поля. Это поле должно показываться только если значение другого поля равно true.
Вот пример, который Не показывает это поле, если это не шаблон главной страницы:
function show_this_field_if_true( $cmb ) {
// Проверяем, является ли текущая страница главной
if ( $cmb->object_id !== get_option( 'page_on_front' ) ) {
return false;
}
return true;
}
Как я могу сделать это условие зависимым от другого поля?
Вам нужно заменить вызов get_option
на вызов get_post_meta
:
function show_this_field_if_true( $cmb ) {
// Проверяем, существует ли другое мета-значение
if ( ! get_post_meta( $cmb->object_id, 'other_meta_key_to_check', 1 ) ) {
return false;
}
return true;
}
Имейте в виду, это будет работать только при первоначальной загрузке страницы и не покажет поле, пока вы не обновите значение other_meta_key_to_check
и не сохраните страницу.

Должно быть возможно использовать ajax для сохранения полей, которые должны вызывать отображение или скрытие блока полей, и перезагружать мета-значения, не так ли?

Лучший способ сделать это — использовать JavaScript, и есть несколько плагинов CMB2, которые позволяют сделать это легко:
