Повторяющиеся значения настраиваемых полей
Я в растерянности. У меня есть пользовательский мета-блок с кодом "мультичека", который создал Ян. Это отлично работает. Моя проблема сейчас заключается в том, чтобы правильно вернуть данные.
Сценарий: существует 5 возможных значений, каждое с одним и тем же метаключем. То, что я пытаюсь сделать, - это отобразить конкретное содержимое, если значение хранится с одним из 5 возможных значений. Происходит то, что содержание повторяется.
Текущий сайт: http://dev.andrewnorcross.com/yoga/locations/tampa/
Текущий код:
<?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° 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° 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° 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° 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 time: 60 min</p>";
echo '</div>';
}
} ?>
4 answers
Проблема заключается в вашем предначертании. Вы повторяете один раз для каждого предложения, но каждый раз оцениваете ВСЕ значения предложения в массиве. Таким образом, ваш PHP добросовестно печатает все доступные предложения * количество предложений. Я бы сказал, обойдитесь без foreach() и посмотрите, что произойдет.
РЕДАКТИРОВАТЬ 1 Также обратите внимание, что вы преобразуете строки в массивы. Вы пытаетесь найти значения в массиве на основе недопустимого ключа. $предложения ["горячие"] - $предложения ["дети"] не существуют, поскольку PHP обеспокоен. $предложения[0] - $предложения[4] ДЕЙСТВИТЕЛЬНО существуют.
РЕДАКТИРОВАТЬ 2 Хорошо, вы хотите следующее вместо вашего foreach():
if(in_array("hot", $offerings)){
// print hot results
}
if(in_array("chill", $offerings)){
//print chill results
}
И т.д.
РЕДАКТИРОВАТЬ 3
Или, если я подумаю об этом дальше, вы могли бы придерживаться foreach() следующим образом:
foreach($offerings as $offering){
switch($offering){
case "hot":
//print hot stuff
break;
case "chill":
//print chill stuff
break;
}
}
РЕДАКТИРОВАТЬ 4
Если бы вы имели дело с большим набором данных, я бы, вероятно, выбрал версию switch(), так как вызовы in_array() каждый раз сканируют весь массив, что может стать дорогостоящим, в то время как foreach() будет просто перебирать массив и перемещать указатель массива с каждой итерацией. Ваш звонок, но я думаю, что это был бы правильный путь для обеспечения надежности в будущем и производительности. (Снижение производительности массива из 5 значений для in_array(), вероятно, незначительно, но эти вещи складываются.)
PHP оценит
$offering["someKey"]==true
Как верно для ключа, если значение для этого ключа не пустое, поэтому я подозреваю, что get_post_meta() возвращает что-то ("null" или даже "") для этих значений.
Попробуйте использовать
$offering["someKey"]===true
Для строгого равенства, и это должно сработать.
Можете ли вы поделиться кодом, который вы используете для регистрации этих ящиков? Похоже, что каждый раз, когда вы сохраняете, каждое значение перезаписывает друг друга. Вам нужно будет сохранить значения в массив.
Попробуйте это:
<?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 ?>° time: <?php echo $offering->time ?>min</p>
</div>
<?php endForEach ?>
</div>
<?php endIf ?>
Вот что я здесь сделал:
- Предварительно установите определения типов предложений. В идеале это было бы основано на данных, но поскольку это явно не так, это лучшая альтернатива.
- Сверьте определения с различными предложениями, доступными для... предложения*, и сложите их в массив.
- Если этот массив не пуст, отобразите соответствующий фрагмент HTML, заполняя атрибуты предложения по мере повторения массив.
*На самом деле, это то, что я почерпнул из ваших предложенных требований - что в данной программе есть набор предлагаемых действий, и что эти действия должны быть перечислены... или что-то в этом роде. Может быть, вы могли бы выразиться более ясно.