[Php] Come visualizzare i metadati del campo Gruppo + Div contenitore se esiste e visualizzare il testo predefinito se i campi sono vuoti?


Answers

Question

Non sono un programmatore, quindi sono privo di soluzioni. Ho utilizzato CMB2 per un tipo di post personalizzato Portfolio / Project.

Ho incorporato una presentazione che utilizza i metadati del campo Gruppo per ogni diapositiva.

Sulla home page ci sono 2 post etichettati "Empty Project" e "Test Project 1". Se fai clic su Progetto vuoto verrai indirizzato alla sua singola pagina di post, vedrai un div ".flexslider" con uno sfondo rosso. Questo è il div che vorrei rimuovere se i Campi Gruppo sono vuoti. Il mio che intendo completato rimuove il div lasciando nessun div vuoto invece di cambiare il colore dello sfondo in bianco.

Se fai clic su "Prova progetto 1", ci saranno le immagini caricate utilizzando i Campi gruppo ripetibile all'interno della presentazione "flexslider". Questo è il risultato di Metafields che sono stati salvati con Metadata all'interno di essi.

METABOX // Ecco il codice che ho usato per registrare i campi ripetibili, che mi permette di inserire immagini e didascalie per la presentazione.

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',
) );

 }

L'ho seguito per visualizzare i metadati per quei campi di gruppo. Tutto funziona perfettamente bene quando uso questo pezzo di codice:

FINE FRONTALE//

<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>

ma mi piacerebbe molto visualizzare il contenitore .flexslider + i metadati SOLO quando i dati esistono. Se i campi sono vuoti, vorrei visualizzare il testo predefinito o, meglio ancora, rimuovere l'intero div stesso. Ho fatto del mio meglio per fare ricerca ma non riesco a capire cosa c'è che non va.

Ho anche provato questo pezzo di codice:

TENTATIVO//

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

L'unica cosa buona del codice qui sopra è che rimuove definitivamente il div quando il meta-campo è vuoto ma se i metadati ESISCONO il div è ancora andato.

EDIT // Ho provato a utilizzare il codice "@stweb" nelle risposte seguenti:

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

ma non succede nulla ... il div rosso si siede lì invece di scomparire.

Fondamentalmente mi piacerebbe capire come posso visualizzare SOLO il primo pezzo di codice se le immagini sono state caricate su Group Field e se non lo sono, non visualizzerai nulla nemmeno del contenitore div.

Qualcuno può spiegare dove ho sbagliato?