web-dev-qa-db-fra.com

Boucle dans les champs personnalisés avec une étiquette/des caractères communs similaires dans l'étiquette

J'ai créé plusieurs champs personnalisés pour mon type de message personnalisé "livres"

Il y a une case à cocher pour les langues. Chaque fois qu'une langue est cochée, plusieurs champs personnalisés pour cette langue sont ajoutés (c'est-à-dire titre, image de couverture, isbn).

Lors de l'affichage du contenu d'un "livre", j'aimerais parcourir mes champs personnalisés et afficher ceux qui appartiennent ensemble dans un panneau réductible. Voici ce que j'ai jusqu'à présent:

           <?php $fields = get_field_objects();
             if ($fields): ?>
             <ul>
              <?php
                foreach ($fields as $name => $field):
                  if (stripos($name, 'isbn') !== false) : ?>
                     <button data-toggle="collapse" data-target="#demo">Deutsch/<?php echo substr($field['label'], strpos($field['label'], " ") + 1); ?></button>
                     <div id="demo" class="collapse">
                     <?php //isbn
                        echo $field['prepend'] . " " . $field['value']; ?> </br>
                        <?php echo the_field('titel_'.substr($field['label'], strpos($field['label'], " ") + 1)); ?>

                      </div>

                   <?php endif;
                 endforeach; ?>
                 </ul>
              <?php endif; ?>

les boutons pour la réduction affichent les données correctes (par exemple, Deutsch/Englisch, Deutsch/Arabisch), mais le titre et le numéro ISBN appartiennent à la première langue affichée.

J'apprécierais toutes les astuces!

le var_dump () de la variable $ fields: EDIT a supprimé le var_dump car il était trop gros!

Modifier

Voici la mise à jour de mon code: Il affiche maintenant les champs et les données corrects, mais je ne sais pas comment le mettre dans le panneau réductible.

 <b>Erhältlich in den folgenden Sprachausgaben:</b>

        <?php
        $fields = get_field_objects();
        if ($fields): ?>
            <br>
            <?php
            foreach ($fields as $name => $field): ?>

                <?php //hoerprobe
                if (get_field('horprobe_verfuegbar') == 1) :
                    if (stripos($name, 'hoerprobe') !== false) : ?>
                        <?php echo $field['label'];
                        $file = get_field($name); ?>
                        <audio controls>
                            <source src="<?php echo $file['url']; ?>">
                            Your browser does not support the audio tag.
                        </audio>
                        </br>

                    <?php endif;
                else :
                    // echo 'false';
                endif; ?>

                <?php
                if (stripos($name, 'isbn') !== false) : ?>
                    <button data-toggle="collapse" data-target="#demo">
                        Deutsch/<?php echo substr($field['label'], strpos($field['label'], " ") + 1); ?></button>

                    <?php //isbn
                    echo $field['prepend'] . " " . $field['value']; ?> </br>

                    <?php //titel
                    echo the_field('titel_' . substr($field['name'], strpos($field['name'], "_") + 1)); ?> </br>

                    <?php //coverimage
                    $titelbild = get_field('titelbild_' . substr($field['name'], strpos($field['name'], "_") + 1)); ?>
                    <?php if ($titelbild) : ?>
                        <img src="<?php echo $titelbild['url']; ?>" alt="<?php echo $titelbild['alt']; ?>"/>
                    <?php endif; ?></br>
                <?php endif;
            endforeach;
        endif; ?>

en ajoutant ceci

<div id="demo" class="collapse">
                       ...</div>

quel que soit le bouton sur lequel je clique, il ne fait qu'ouvrir les données de la première langue ..

Éditer 2

Le fichier audio ne fonctionne pas à l'intérieur du panneau de réduction. Voici comment cela fonctionne:

 <b>Erhältlich in den folgenden Sprachausgaben:</b>

        <?php
        $fields = get_field_objects();
        if ($fields): ?>
            <br>
            <?php
            foreach ($fields as $name => $field): ?>

                <?php //hoerprobe

                if (get_field('horprobe_verfuegbar') == 1) :

                    if (stripos($name, 'hoerprobe') !== false) : ?>

                        <?php echo $field['label'];
                        $file = get_field($name); ?>
                        <audio controls>
                            <source src="<?php echo $file['url']; ?>">
                            Your browser does not support the audio tag.
                        </audio>
                        </br>

                    <?php endif;
                else :
                    // echo 'false';
                endif; ?>
                <?php
                if (stripos($name, 'isbn') !== false) : ?>
                    <?php $lang = substr($field['name'], strpos($field['name'], "_")); ?>
                    <button data-toggle="collapse" data-target="#demo<?php echo $lang ?>">
                        Deutsch/<?php echo substr($field['label'], strpos($field['label'], " ") + 1); ?> </button>

                    <div id="demo<?php echo $lang ?>" class="collapse">
                        Lorem ipsum dolor text....

                        <?php //isbn
                        echo $field['prepend'] . " " . $field['value']; ?> </br>

                        <?php //titel
                        echo the_field('titel_' . substr($field['name'], strpos($field['name'], "_") + 1)); ?> </br>

                        <?php //coverimage
                        $titelbild = get_field('titelbild_' . substr($field['name'], strpos($field['name'], "_") + 1)); ?>
                        <?php if ($titelbild) : ?>
                        <img src="<?php echo $titelbild['url']; ?>" alt="<?php echo $titelbild['alt']; ?>"/>
                        <?php endif; ?></br>
                    </div>
                <?php endif;
            endforeach;
        endif; ?>

mais dès que je déplace la partie hoerprobe à l'intérieur du panneau d'effondrement, elle ne l'affiche plus.

1
sonja

Vous affichez les données en boucle, de sorte que tous les éléments ont le même ID div id="demo". Ajoutez un suffixe pour les rendre uniques. Par exemple:

$lang = substr($field['name'], strpos($field['name'], "_");

echo '<button data-toggle="collapse" data-target="#demo-'. $lang .'"> ....';

echo '<div id="demo-'. $lang .'" class="collapse"> ...</div>'

Modifier

L'audio ne fonctionne pas dans le panneau de réduction, car la clé $name ne remplit jamais les deux conditions:

if (stripos($name, 'isbn') !== false): 
   if (stripos($name, 'hoerprobe') !== false)

$name est soit hoerprobe_arabisch ou isbn_arabisch .

Essayez ce code:

if (stripos($name, 'isbn') !== false) : ?>
   <?php $lang = substr($field['name'], strpos($field['name'], "_")); ?>
   <button data-toggle="collapse" data-target="#demo<?php echo $lang ?>">
      Deutsch/<?php echo substr($field['label'], strpos($field['label'], " ") + 1); ?> </button>

    <div id="demo<?php echo $lang ?>" class="collapse">
         Lorem ipsum dolor text....

       <?php //isbn
          echo $field['prepend'] . " " . $field['value']; ?> </br>

       <?php //titel
          echo the_field('titel'. $lang); ?> </br>

       <?php //coverimage
          $titelbild = get_field('titelbild' . $lang); ?>
          <?php if ($titelbild) : ?>
              <img src="<?php echo $titelbild['url']; ?>" alt="<?php echo $titelbild['alt']; ?>"/>
          <?php endif; ?></br>

       if (isset($fields['hoerprobe_'.$lang])) : ?>

           <?php
           $hoerprobe_field_name = 'hoerprobe'.$lang;
           $hoerprobe_field = $fields[$hoerprobe_field_name ];
           echo $hoerprobe_field['label'];
           $file = get_field(hoerprobe_field_name); ?>

           <audio controls>
               <source src="<?php echo $file['url']; ?>">
                    Your browser does not support the audio tag.
               </audio></br>
       <?php endif;

    </div>
<?php endif;
1
nmr