Я не программист, поэтому я не знаю решений. Я использую CMB2 для персонализированного типа портфолио/проекта.Как отображать метаданные полей группы + контейнер контейнера, если он существует, и отображать текст по умолчанию, если поля пустые? [CMB2]
Я включил слайд-шоу, в котором используются метаданные Group Field для каждого слайда.
На домашней странице размещено 2 сообщения с надписью «Empty Project» & «Test Project 1». Если вы нажмете «Пустой проект», вы попадете на одну страницу с сообщением, там вы увидите «.flexslider» div с красным фоном. Это div, который я бы хотел удалить, если поля группы пустые. Мой, что я имею в виду, завершил удаление div, не оставляя пустых div, вместо того, чтобы менять цвет фона на белый.
Если вы нажмете «Test Project 1», будут загружены изображения с использованием полей повторяющихся групп в слайд-шоу «flexslider». Это должно быть результатом Metafields, которые были сохранены с помощью метаданных внутри них.
METABOX // Вот код, который я использовал для регистрации повторяющихся полей, что позволяет мне вставлять изображения и подписи для слайд-шоу.
add_action('cmb2_admin_init', 'gallery_metabox');
function gallery_metabox() {
$prefix = 'gallery_';
/**
* Repeatable Field Groups
*/
$cmb_group = new_cmb2_box(array(
'id' => $prefix . 'metabox',
'title' => __('Gallery', 'cmb2'),
'object_types' => array('portfolio',),
));
// $group_field_id is the field id string, so in this case: $prefix . 'demo'
$group_field_id = $cmb_group->add_field(array(
'id' => $prefix . 'demo',
'type' => 'group',
'options' => array(
'group_title' => __('Image {#}', 'cmb2'), // {#} gets replaced by row number
'add_button' => __('Add Another Image', 'cmb2'),
'remove_button' => __('Remove Image', 'cmb2'),
'sortable' => true, // beta
'closed' => true, // true to have the groups closed by default
),
));
$cmb_group->add_group_field($group_field_id, array(
'name' => __('Image', 'cmb2'),
'id' => 'image',
'type' => 'file',
));
$cmb_group->add_group_field($group_field_id, array(
'name' => __('Image Caption', 'cmb2'),
'id' => 'image_caption',
'type' => 'text',
));
}
Я последовал this отображать метаданные для этих полей группы. Все отлично работает, когда я использую этот кусок кода:
Front-End //
<div class="flexslider">
<ul class="slides">
<?php $entries = get_post_meta(get_the_ID(), 'gallery_demo', true);
foreach ((array) $entries as $key => $entry) {
$img = $img_url = $caption = '';
if (isset($entry['image_id'])) {
$img = wp_get_attachment_image($entry['image_id'], 'share-pick', null, array(
'class' => 'thumb',
));
}
if (isset($entry['image_id'])) {
$img_url = wp_get_attachment_image_url($entry['image_id'], null);
}
$caption = isset($entry['image_caption']) ? wpautop($entry['image_caption']) : '';
echo '<li data-thumb="'. $img_url .'">';
echo $img;
echo $caption;
echo '</li>';
} ?>
</ul>
</div>
, но я бы очень хотел, чтобы отобразить .flexslider
контейнер + метаданные только при наличии данных. Если поля пусты, я хотел бы отображать текст по умолчанию или лучше, но удалить весь сам div. Я старался изо всех сил заниматься исследованиями, но я не могу понять, что не так.
Я также попробовал этот кусок кода, а также:
ПОПЫТКА //
<?php $entries = get_post_meta(get_the_ID(), 'gallery_demo', true);
if(empty ($entry)) { echo ''; }
else {
foreach ((array) $entries as $key => $entry) {
echo '<div class="flexslider">';
echo '<ul class="slides">';
$img = $img_url = $caption = '';
if (isset($entry['image_id'])) {
$img = wp_get_attachment_image($entry['image_id'], 'share-pick', null, array(
'class' => 'thumb',
));
}
if (isset($entry['image_id'])) {
$img_url = wp_get_attachment_image_url($entry['image_id'], null);
}
$caption = isset($entry['image_caption']) ? wpautop($entry['image_caption']) : '';
echo '<li data-thumb="'. $img_url .'">';
echo $img;
echo $caption;
echo '</li>';
echo '</ul>';
echo '</div>';
}
}
?>
Единственная хорошая вещь о коде выше является то, что он определенно удаляет DIV, когда metafield является пустой, но если метаданные существуют, div по-прежнему отсутствует.
EDIT // Я попытался с помощью «@stweb» код в ответах ниже:
$entries = get_post_meta(get_the_ID(), 'gallery_demo', true);
foreach ((array) $entries as $key => $entry) {
if(empty($entry)){
continue;
}
echo '<div class="flexslider">';
echo '<ul class="slides">';
$img = $img_url = $caption = '';
if (isset($entry['image_id'])) {
$img = wp_get_attachment_image($entry['image_id'], 'share-pick',
null, array( 'class' => 'thumb',));
}
if (isset($entry['image_id'])) {
$img_url = wp_get_attachment_image_url($entry['image_id'], null);
}
$caption = isset($entry['image_caption']) ? wpautop(
$entry['image_caption']) : '';
echo '<li data-thumb="'. $img_url .'">';
echo $img;
echo $caption;
echo '</li>';
echo '</ul>';
echo '</div>';
}
, но ничего не происходит ... красный ДИВ просто сидит там вместо того, чтобы исчезнуть.
В основном я хотел бы выяснить, как я могу отображать первый кусок кода ТОЛЬКО, если изображения были загружены в поле группы, а если нет, то вообще ничего не отображаться даже в контейнере div.
Может кто-нибудь объяснить, где я поступил не так?
Это не работа для меня вопрос, имеющий, все равно спасибо. – KXXT
Код, который вы предоставили, не удаляет контейнер div, если поля пусты. – KXXT
Вам нужно показать контейнер, если установлены оба изображения и image_caption? – stweb