2016-08-01 2 views
5

Я не программист, поэтому я не знаю решений. Я использую 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.

Может кто-нибудь объяснить, где я поступил не так?

ответ

2

Попробуйте это:

$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>';  
} 

UPDATE:

foreach ((array) $entries as $key => $entry) { 
    if (!isset($entry['image_id']) || $entry['image_id'] == '' ) { 
     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>';  
} 
+0

Это не работа для меня вопрос, имеющий, все равно спасибо. – KXXT

+0

Код, который вы предоставили, не удаляет контейнер div, если поля пусты. – KXXT

+0

Вам нужно показать контейнер, если установлены оба изображения и image_caption? – stweb

Смежные вопросы