Valores de campo personalizados que se repiten

2

Estoy en una pérdida. Tengo un meta box personalizado con el código 'multicheck' que Jan creó. Está funcionando muy bien. Mi problema ahora es conseguir que los datos se devuelvan correctamente.

Escenario: hay 5 valores posibles, cada uno con la misma meta_key. Lo que estoy tratando de hacer es mostrar contenido específico si un valor se almacena con uno de los 5 valores posibles. Lo que está sucediendo es que el contenido se está repitiendo.

Sitio actual: enlace

Código actual:

    <?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>';
                }
                } ?>
    
pregunta Norcross 18.01.2011 - 22:14

4 respuestas

3

Tu problema es el problema. Está iterando una vez para cada oferta, pero está evaluando TODOS los valores de oferta en la matriz cada vez. Por lo tanto, su PHP está imprimiendo diligentemente todas las ofertas disponibles * el número de ofertas. Yo diría que vaya sin el foreach () y vea qué sucede.

EDIT 1 También tenga en cuenta que está lanzando cadenas a matrices. Está intentando buscar valores en una matriz basada en una clave no válida. Las ofertas de $ ["hot"] - las ofertas de $ ["kids"] no existen, en lo que respecta a PHP. $ ofrendas [0] - $ ofrendas [4] SÍ existen.

EDIT 2 Está bien, quieres lo siguiente en lugar de tu foreach ():

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

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

etc.

EDIT 3

O, si lo pienso más, podrías seguir con el foreach () de la siguiente manera:

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

EDIT 4

Si estuviera tratando con un conjunto de datos más grande, probablemente iría con la versión switch (), ya que las llamadas in_array () escanean toda la matriz cada vez, lo que puede resultar costoso, mientras que foreach () simplemente iterará a través de la matriz y mueva el puntero de matriz con cada iteración. Su llamada, pero estoy pensando que ese sería el camino a seguir para asegurar el futuro y el rendimiento. (El impacto de rendimiento en una matriz de 5 valores para in_array () es probablemente minúsculo, pero estas cosas se suman).

    
respondido por el ZaMoose 18.01.2011 - 22:42
2

PHP evaluará

$offering["someKey"]==true

igual a verdadero para una clave siempre que el valor de esa clave no esté vacío, por lo que sospecho que get_post_meta () está devolviendo algo ("null" o incluso "") para esos valores.

intenta usar

$offering["someKey"]===true

para la igualdad estricta y debería funcionar.

    
respondido por el cori 18.01.2011 - 22:44
0

¿Puede compartir el código que está utilizando para registrar esos cuadros? Suena como cada vez que se guarda, cada valor se sobrescribe entre sí. Deberá guardar los valores en una matriz.

    
respondido por el user2575 18.01.2011 - 22:34
0

Prueba esto:

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

Lo que he hecho aquí es:

  1. Preseleccione las definiciones de los tipos de oferta. Idealmente, esto sería impulsado por datos, pero como obviamente no lo es, esta es la mejor alternativa.
  2. Compare las definiciones con las diversas ofertas disponibles para ... que ofrecen *, y apílelas en una matriz.
  3. Si esa matriz no está vacía, muestre el fragmento de HTML adecuado, rellenando los atributos de oferta a medida que itera sobre la matriz.

* En realidad, eso es lo que he deducido de los requisitos sugeridos: que un programa dado tiene un conjunto de actividades ofrecidas y que estas actividades deben enumerarse ... o algo así. Tal vez podrías ser más claro.

    
respondido por el Fordi 19.01.2011 - 19:48

Lea otras preguntas en las etiquetas