it-swarm.com.de

Benutzerdefinierte Feldwerte werden wiederholt

Ich bin ratlos. Ich habe eine benutzerdefinierte Meta-Box mit dem von Jan erstellten 'Multicheck'-Code. Es funktioniert großartig. Mein Problem ist jetzt, dass die Daten ordnungsgemäß zurückgegeben werden.

Szenario: Es gibt 5 mögliche Werte mit jeweils demselben meta_key. Ich versuche, einen bestimmten Inhalt anzuzeigen, wenn ein Wert mit einem der 5 möglichen Werte gespeichert ist. Was passiert ist, dass sich der Inhalt wiederholt.

Aktuelle Seite: http://dev.andrewnorcross.com/yoga/locations/tampa/

Aktueller Code:

    <?php
    global $post;
$offerings = get_post_meta($post->ID, "evol_offerings_select", false);
if ($offerings[0]=="") { ?>

<!-- If there are no custom fields, show nothing -->

<?php } else { ?>

<div class="offerings">
    <h3>offerings:</h3>
            <?php 
            foreach ($offerings as $offering) {
                if ($offering["hot"]==true) {
                    echo "<div class='single_offering'>";
                    echo "<h3>Hot 90</h3>";
                    echo "<p class='class_info'>temp: 105&deg;&nbsp;&nbsp;&nbsp;time: 90 min</p>";
                    echo '</div>';
                }
                if ($offering["flow"]==true) {
                echo "<div class='single_offering'>";
                echo "<h3>Flow 75</h3>";
                echo "<p class='class_info'>temp: 80&deg;&nbsp;&nbsp;&nbsp;time: 75 min</p>";
                echo '</div>';
                }
                if ($offering["warm"]==true) {
                echo "<div class='single_offering'>";
                echo "<h3>Warm 60</h3>";
                echo "<p class='class_info'>temp: 90&deg;&nbsp;&nbsp;&nbsp;time: 60 min</p>";
                echo '</div>';
                }
                if ($offering["chill"]==true) {
                echo "<div class='single_offering'>";
                echo "<h3>Chill 30</h3>";
                echo "<p class='class_info'>temp: 75-80&deg;&nbsp;&nbsp;&nbsp;time: 30 min</p>";                    
                echo '</div>';
                }
                if ($offering["kids"]==true) {
                echo "<div class='single_offering'>";
                echo "<h3>Kids Class</h3>";
                echo "<p class='class_info'>temp: comfy&nbsp;&nbsp;&nbsp;time: 60 min</p>";
                echo '</div>';
                }
                } ?>
2
Norcross

Ihr foreach ist das Problem. Sie iterieren einmal für jedes Angebot, evaluieren jedoch jedes Mal ALLE Angebotswerte im Array. Ihr PHP druckt also pflichtgemäß alle verfügbaren Angebote aus * die Anzahl der Angebote. Ich würde sagen, geh ohne foreach () und schau was passiert.

EDIT 1 Beachten Sie auch, dass Sie Strings in Arrays umwandeln. Sie versuchen, Werte in einem Array basierend auf einem ungültigen Schlüssel nachzuschlagen. $ offerings ["hot"] - $ offerings ["kids"] existieren nicht, soweit es PHP betrifft. $ Opfergaben [0] - $ Opfergaben [4] existieren.

EDIT 2 Okay, Sie möchten Folgendes anstelle von foreach ():

if(in_array("hot", $offerings)){
// print hot results
}

if(in_array("chill", $offerings)){
//print chill results
}

usw.

EDIT 3

Oder, wenn ich weiter darüber nachdenke, könnten Sie wie folgt bei foreach () bleiben:

foreach($offerings as $offering){
 switch($offering){
   case "hot":
    //print hot stuff
   break;
   case "chill":
    //print chill stuff
   break;
 }
}

EDIT 4

Wenn Sie mit einem größeren Datensatz arbeiten würden, würde ich wahrscheinlich die switch () -Version wählen, da die in_array () -Aufrufe jedes Mal das gesamte Array durchsuchen, was teuer werden könnte, während foreach () einfach das Array durchläuft und bewegen Sie den Array-Zeiger bei jeder Iteration. Ihr Anruf, aber ich denke, das wäre der richtige Weg, um zukunftssicher und leistungsfähig zu sein. (Der Leistungstreffer für ein Array mit 5 Werten für in_array () ist wahrscheinlich winzig, aber diese Dinge summieren sich.)

3
ZaMoose

PHP wird auswerten

$offering["someKey"]==true

so wahr für einen Schlüssel, solange der Wert für diesen Schlüssel nicht leer ist, also vermute ich, dass get_post_meta () etwas ("null" oder sogar "") für diese Werte zurückgibt.

versuchen Sie es mit

$offering["someKey"]===true

für strenge Gleichheit und es sollte funktionieren.

2
cori

Können Sie den Code teilen, mit dem Sie diese Felder registrieren? Klingt so, als würden sich die Werte bei jedem Speichern gegenseitig überschreiben. Sie müssen die Werte in einem Array speichern.

0
user2575

Versuche dies:

 <?php
    global $post;
    $offerings = get_post_meta($post->ID, "evol_offerings_select", false);
    $offeringDefinitions = array(
        'hot'   =>(object)array('name'=>'Hot 90',       'temp'=>'105',      'time'=>'90'),
        'flow'  =>(object)array('name'=>'Flow 75',      'temp'=>'80',       'time'=>'75'),
        'warm'  =>(object)array('name'=>'Warm 60',      'temp'=>'90',       'time'=>'60'),
        'chill' =>(object)array('name'=>'Chill 30',     'temp'=>'75-80',    'time'=>'30'),
        'kids'  =>(object)array('name'=>'Kids Class',   'temp'=>'comfy',    'time'=>'60')
    );
    $offeringsInUse = array();
    forEach($offerings as $offering) {
        forEach($offeringDefinitions as $offeringName=>$offeringDefinition) {
            if ($offering[$offeringName]) $offeringsInUse[$offeringName]=$offeringDefinition;
        }
    }
?>
<?php if (count($offeringsInUse)>0): ?>
    <div class="offerings">
        <h3>offerings:</h3>
        <?php forEach ($offeringsInUse as $offering): ?>
            <div class="single_offering">
                <h3><?php echo $offering->name ?></h3>
                <p class="class_info">temp: <?php echo $offering->temp ?>&deg;&nbsp;&nbsp;&nbsp;time: <?php echo $offering->time ?>min</p>
            </div>
        <?php endForEach ?>
    </div>
<?php endIf ?>

Was ich hier gemacht habe ist:

  1. Stellen Sie die Definitionen der Angebotsarten ein. Idealerweise wäre dies datengetrieben, aber da dies offensichtlich nicht der Fall ist, ist dies die beste Alternative.
  2. Überprüfen Sie die Definitionen anhand der verschiedenen verfügbaren Angebote pro Angebot * und stapeln Sie diese in ein Array.
  3. Wenn dieses Array nicht leer ist, zeigen Sie den entsprechenden HTML-Block an und geben Sie die Angebotsattribute ein, während Sie das Array durchlaufen.

* Genau das habe ich aus Ihren Vorschlägen abgeleitet - dass ein bestimmtes Programm eine Reihe von angebotenen Aktivitäten enthält und dass diese Aktivitäten aufgezählt werden müssen ... oder so. Vielleicht könnten Sie klarer sein.

0
Fordi