У меня есть это поле выбора HTML optgroup, которое заполняется из значений, хранящихся в базе данных WordPress.
$field_val = get_post_meta($post->ID, $field['id'], true);
echo '<select id="'.$field['id'].'" name="'.$field['id'].'">';
foreach ($field['options'] as $key => $value) {
$custom_fields = get_post_custom($value);
$bgtypes = $custom_fields['bgtype'];
foreach($bgtypes as $bgkey => $type){
echo '<optgroup label="'.$type.'">';
echo '<option value="'.$value.'" '.selected($value, $field_val, false).'>'.$key.'</option>';
echo '</optgroup>';
}
}
echo '</select>';
Он извлекает все правильные данные, однако при выводе значений значения не «группируются».
Вот пример возвращаемых результатов:
<select id="_wpbp_background" name="_wpbp_background">
<optgroup label="youtube">
<option value="2777" >YouTube Playlist video</option>
</optgroup>
<optgroup label="videos">
<option value="2775" >Another Self Hosted Video</option>
</optgroup>
<optgroup label="images">
<option value="2774" >Image Slideshow Main</option>
</optgroup>
<optgroup label="pattern">
<option value="2773" >Carbon Pattern BG</option>
</optgroup>
<optgroup label="solid">
<option value="2772" >Purple Solid BG Color</option>
</optgroup>
<optgroup label="audio">
<option value="2771" >Test Audio File 2</option>
</optgroup>
<optgroup label="images">
<option value="2759" >test image slideshow</option>
</optgroup>
<optgroup label="videos">
<option value="2747" selected='selected'>Test Hosted Video</option>
</optgroup>
<optgroup label="youtube">
<option value="2736" >YouTube Video 1</option>
</optgroup>
<optgroup label="pattern">
<option value="2718" >Pattern 1</option>
</optgroup>
<optgroup label="videos">
<option value="2711" >test video 1</option>
</optgroup>
<optgroup label="audio">
<option value="2693" >Test audio file 1</option>
</optgroup>
<optgroup label="images">
<option value="2670" >test image</option>
</optgroup>
<optgroup label="solid">
<option value="2669" >Blue Solid Background</option>
</optgroup>
<optgroup label="solid">
<option value="2667" >Red Background</option>
</optgroup>
</select>
Если вы посмотрите на возвращенные результаты, вы заметите, что существует много групп с одинаковыми именами. «Изображения» например.
Есть ли способ изменить исходный код PHP, чтобы сгруппировать эти параметры следующим образом:
<select id="_wpbp_background" name="_wpbp_background">
<optgroup label="images">
<option value="2774" >Image Slideshow Main</option>
<option value="2759" >test image slideshow</option>
<option value="2670" >test image</option>
</optgroup>
<optgroup label="solid">
<option value="2669" >Blue Solid Background</option>
<option value="2667" >Red Background</option>
</optgroup>
</select>
Любая помощь будет принята с благодарностью. Спасибо
================================================== ====================
РЕДАКТИРОВАТЬ:
Вот оригинальная функция, которую я вызываю, чтобы получить пользовательские элементы типа поста «фоны»:
/**
* Returns a list of backgrounds
*/
function get_backgrounds(){
$bgs = get_posts(array(
'post_type' => $this->cpt,
'numberposts' => -1,
'orderby' => 'title',
));
$backgrounds = array();
$backgrounds[__('-- Select Background --', $this->prefix)] = '';
foreach($bgs as $key => $value){
$backgrounds[$value->post_title] = $value->ID;
}
return $backgrounds;
}
При вызове вышеуказанный код отображает
Array
(
[-- Select Background --] =>
[YouTube Video 1] => 2736
[YouTube Playlist video] => 2777
[test video 1] => 2711
[test image slideshow] => 2759
[test image] => 2670
[Test Hosted Video] => 2747
[Test Audio File 2] => 2771
[Test audio file 1] => 2693
[Red Background] => 2667
[Purple Solid BG Color] => 2772
[Pattern 1] => 2718
[Image Slideshow Main] => 2774
[Carbon Pattern BG] => 2773
[Blue Solid Background] => 2669
[Another Self Hosted Video] => 2775
)
Первый блок кода, который частично работает:
// <optgroup> of the previous <option>
$previous = "";
// variable to set the first group
$first_group = true;
foreach ($field['options'] as $key => $value) {
$custom_fields = get_post_custom($value);
if (isset($custom_fields['bgtype'][0]) && $custom_fields['bgtype'][0]) {
$bgtypes = $custom_fields['bgtype'];
foreach($bgtypes as $typebg){
if ($typebg != $previous) {
if (!$first_group) {
echo '</optgroup>';
} else {
$first_group = false;
}
echo '<optgroup label="'.$typebg.'">';
$previous = $typebg;
}
echo '<option value="'.$value.'" '.selected($value, $field_val, false).'>'.$key.'</option>';
}
}
}
echo '</optgroup>'; // close last optgroup
echo '</select>';
Результаты первого блока кода:
<select id="_wpbp_background" name="_wpbp_background">
<optgroup label="youtube">
<option value="2736" >YouTube Video 1</option>
<option value="2777" >YouTube Playlist video</option>
</optgroup>
<optgroup label="videos">
<option value="2711" >test video 1</option>
</optgroup>
<optgroup label="images">
<option value="2759" >test image slideshow</option>
<option value="2670" >test image</option>
</optgroup>
<optgroup label="videos">
<option value="2747" selected='selected'>Test Hosted Video</option>
</optgroup>
<optgroup label="audio">
<option value="2771" >Test Audio File 2</option>
<option value="2693" >Test audio file 1</option>
</optgroup>
<optgroup label="solid">
<option value="2667" >Red Background</option>
<option value="2772" >Purple Solid BG Color</option>
</optgroup>
<optgroup label="pattern">
<option value="2718" >Pattern 1</option>
</optgroup>
<optgroup label="images">
<option value="2774" >Image Slideshow Main</option>
</optgroup>
<optgroup label="pattern">
<option value="2773" >Carbon Pattern BG</option>
</optgroup>
<optgroup label="solid">
<option value="2669" >Blue Solid Background</option>
</optgroup>
<optgroup label="videos">
<option value="2775" >Another Self Hosted Video</option>
</optgroup>
</select>
Как вы можете видеть, этот блок кода частично группирует элементы по их «bytpe». Он группирует некоторые из них, но НЕ ВСЕ. То, как я получил это для группировки таким образом, было добавить 'orderby' => 'title'
к начальной функции для отображения фона.
**Second code block:**
echo '<select id="'.$field['id'].'" name="'.$field['id'].'">';
foreach ($field['options'] as $key => $value) {
$custom_fields = get_post_custom($value);
$bgtypes = $custom_fields['bgtype'];
foreach($bgtypes as $bgkey => $type){
if(strpos($type,'images') !== false):
$images.= '<optgroup label="'.$type.'">'.'<option value="'.$value.'" '.selected($value, $field_val, false).'>'.$key.'</option>'.'</optgroup>';
elseif(strpos($type,'youtube') !== false):
$youtube.= '<optgroup label="'.$type.'">'.'<option value="'.$value.'" '.selected($value, $field_val, false).'>'.$key.'</option>'.'</optgroup>';
else:
$other.= '<optgroup label="'.$type.'">'.'<option value="'.$value.'" '.selected($value, $field_val, false).'>'.$key.'</option>'.'</optgroup>';
endif;
}
}
echo $images;
echo $youtube;
echo $other;
echo '</select>';
В этом коде я изменил функцию strpos на if(strpos($type,'images') !== false):
сравнить с фактическим «bgtype», поскольку переменная $ bgkey возвращала 0 для всех результатов.
К сожалению, этот код все еще возвращает список, не сгруппированный по их «bgtypes».
Изменить 3: Новый код, который возвращает «PostId», «Заголовок сообщения» & «BGType».
// Get a list of all the created backgrounds
$bgs = get_posts(array(
'post_type' => 'wpbp-backgrounds',
'numberposts' => -1,
'orderby' => 'title',
));
foreach($bgs as $key => $value){
// Post Id
$cpid = $value->ID;
// Post Title
$cptitle = $value->post_title;
// BGType
$custom_fields = get_post_custom($cpid);
$cpbgtype = $custom_fields['bgtype'];
if (isset($custom_fields['bgtype'][0]) && $custom_fields['bgtype'][0]) {
//This is where I would create all the code and group them
}
}
Результаты использования приведенного выше кода echo $cpid . ' - ' . $cptitle .' - '.$cpbgtype.'<br>';
являются:
2736 - YouTube Video 1 - youtube
2777 - YouTube Playlist video - youtube
2711 - test video 1 - videos
2759 - test image slideshow - images
2670 - test image - images
2747 - Test Hosted Video - videos
2771 - Test Audio File 2 - audio
2693 - Test audio file 1 - audio
2667 - Red Background - solid
2772 - Purple Solid BG Color - solid
2718 - Pattern 1 - pattern
2774 - Image Slideshow Main - images
2773 - Carbon Pattern BG - pattern
2669 - Blue Solid Background - solid
2775 - Another Self Hosted Video - videos
Этот код выше, кажется, предоставляет все детали для элементов. Я просто не уверен, как сгруппировать их в optgroup и отобразить их в выпадающем списке.
Редактировать 4: Вывод var_dump ()
Если я запускаю этот код: var_dump($cpbgtype);
Я получаю этот вывод:
array(1) {
[0]=>
string(7) "youtube"}
array(1) {
[0]=>
string(7) "youtube"}
array(1) {
[0]=>
string(6) "videos"}
array(1) {
[0]=>
string(6) "images"}
array(1) {
[0]=>
string(6) "images"}
array(1) {
[0]=>
string(6) "videos"}
array(1) {
[0]=>
string(5) "audio"}
array(1) {
[0]=>
string(5) "audio"}
array(1) {
[0]=>
string(5) "solid"}
array(1) {
[0]=>
string(5) "solid"}
array(1) {
[0]=>
string(7) "pattern"}
array(1) {
[0]=>
string(6) "images"}
array(1) {
[0]=>
string(7) "pattern"}
array(1) {
[0]=>
string(5) "solid"}
array(1) {
[0]=>
string(6) "videos"}
Однако, если я запускаю этот код var_dump($custom_fields['bgtype'][0]);
Я получаю этот вывод. Не уверен, какой из них назвать, так как этот на самом деле, как я могу ссылаться на каждый «bgtype»
string(7) "youtube"string(7) "youtube"string(6) "videos"string(6) "images"string(6) "images"string(6) "videos"string(5) "audio"string(5) "audio"string(5) "solid"string(5) "solid"string(7) "pattern"string(6) "images"string(7) "pattern"string(5) "solid"string(6) "videos"
Редактировать 5: Вывод var_dump ($ custom_fields)
array(14) {
["_edit_lock"]=>
array(1) {
[0]=>
string(12) "1421540192:1"}
["_edit_last"]=>
array(1) {
[0]=>
string(1) "1"}
["bgtype"]=>
array(1) {
[0]=>
string(7) "youtube"}
["poster"]=>
array(1) {
[0]=>
string(70) "http://localhost/wordpress-dev/wp-content/uploads/2015/01/mash_ups.png"}
["volume"]=>
array(1) {
[0]=>
string(2) "10"}
["mute"]=>
array(1) {
[0]=>
string(4) "true"}
["showplay"]=>
array(1) {
[0]=>
string(4) "true"}
["showmute"]=>
array(1) {
[0]=>
string(4) "true"}
["paused"]=>
array(1) {
[0]=>
string(5) "false"}
["loopvideo"]=>
array(1) {
[0]=>
string(5) "false"}
["ytbtnbg"]=>
array(1) {
[0]=>
string(7) "#565656"}
["ytbtntxt"]=>
array(1) {
[0]=>
string(7) "#ffffff"}
["video_controls"]=>
array(1) {
[0]=>
string(11) "bottom_left"}
["playlist"]=>
array(1) {
[0]=>
string(59) "ZKa8OEPCZrg,goKm9Oafs3E,OCHy1nUdfu8,mpCFLr0NPjA,i3WX-VeNKmk"}
}
Из этого var_dump () я после BGType, который в этом случае:
["bgtype"]=>
array(1) {
[0]=>
string(7) "youtube"}
Это то, что возвращается для каждого отдельного фона, который я вызываю, когда в цикле
Вы можете сделать простой тест if, чтобы увидеть, что содержит ключ $ …
$field_val = get_post_meta($post->ID, $field['id'], true);
$bgtypes= array('youtube', 'videos', 'images', 'solid', 'audio'); // adjust this to create the headings. As far as i can see this will be more or less consistant?
foreach($bgtypes as $bgkey):
//remove plurals to make checking easier
if (substr($bgkey, -1) == 's')
$bgkey = substr($bgkey, 0, -1);
foreach($field['options'] as $option => $key):
if(stripos($option, $bgkey) !==false ):
$options[$bgkey][$option]= $key;
unset($field['options'][$option]);
endif;
endforeach;
endforeach;
$options['other']= $field['options'];echo '<select id="'.$field['id'].'" name="'.$field['id'].'">';foreach($options as $item=>$key):
echo '<optgroup label="'.$item.'">';
foreach($key as $line=>$data):
echo '<option value="'.$data.'" >'.$line.'</option>';
endforeach;
echo '</optgroup>';
endforeach;
echo '</select>';
Я должен был догадаться о выводе некоторых массивов, но он должен быть достаточно близко.
Ответ на 3-е редактирование:
$bgs = get_posts(array(
'post_type' => 'wpbp-backgrounds',
'numberposts' => -1,
'orderby' => 'title',
));
foreach($bgs as $key => $value){
// Post Id
$cpid = $value->ID;
// Post Title
$cptitle = $value->post_title;
// BGType
$custom_fields = get_post_custom($cpid);
$cpbgtype = $custom_fields['bgtype'][0];
// since the data is associated with the post its easier to implement.
if (isset($custom_fields['bgtype'][0]) && $custom_fields['bgtype'][0]) {
$output[$cpbgtype][]= '<option value="'.$cpid.'" >'.$cptitle.'</option>' ;
}
}
echo '<select id="'.$field['id'].'" name="'.$field['id'].'">'; // dont know if the $field values are still there
foreach($output as $type=>$data):
echo '<optgroup label="'.$type.'">';
foreach($data as $item):
echo $item;
endforeach;
echo '</optgroup>';
endforeach;
echo '</select>';
Других решений пока нет …