Multiple fieldsets – решение проблемы для WordPress. Проблема с загрузкой файлов

Обновлено 2011.02.04 (1.0.2) – исправлен баг с редактированием полей, загрузкой файлов. исправлена инструкция по настройке плагина.

Обновлено 2011.01.09 (1.0.1) – исправлен баг с выводом массива в функции.[/spoiler]

Создание дополнительных полей (custom fields) для WordPress, наверное, никогда не было проблемой. А вот с набором полей (fieldsets) немного сложнее. Оказывается у замечательного плагина Custom Fields Template есть такая возможность. Однако, почему-то она не документируется (или я не нашел?!) в списке его опций…

Но, казалось бы, всё решено! Но нет… Есть еще одна мелочь. А это – порядок вывода этих полей меняется при каждом сохранении. Кто столкнулся с этим – знает, о чем речь идёт.

Конечно, решение есть и для этого.

ОБНОВЛЕНИЕ (2011/02/04): Также мучал меня постоянно баг с загрузкой файлов – часто после сохранения файлы пропадали. В “Media Library” они добавлялись, но в custom полях – нет. Не хочется повторяться, НО решение есть и для этого. 😉

Устанавливаем плагин Custom Fields Template. Для создания набора полей используем следующий код:

[bash]
[fieldset_name-fieldset]
type = fieldset_open
multiple = true
multipleButton = true

[fieldset_name-your_field_name_1]
type = textfield
label = Title
blank = true

[fieldset_name-your_field_name_2]
type = textfield
label = Title

[fieldset_name-fieldset]
type = fieldset_close
[/bash]

Где “fieldset_name-” – это имя набора полей. Вы можете поменять его на свое, однако у всех полей название обязательно должно начинаться с имени, которое вы зададите. Имя нужно задать такое, чтобы оно не совпадало с другими полями.

your_field_name_1” – имя поля, которое вы меняете на свое.

Также убедитесь, что у каждого поля есть атрибут blank = true, кроме полей типа file – этой опции для таких полей не надо задавать true.

Далее, в файле с вашими функциями (обычно это functions.php) добавляете следующее:

[php]/**
* Constructs an ordered array from cf metadata
*
* @param string $like_item set in the CFT plugin based on the repeating fieldset name e.g. “test-” would use ‘test-fieldset’.
* Keep the meta_key unique.
* @return array associated array
*/
function get_cft_fieldset_data($like_item) {
global $post, $wpdb;

$sql = “SELECT * FROM $wpdb->postmeta WHERE post_id = $post->ID AND meta_key LIKE ‘%” . $like_item . “%’ ORDER BY meta_id ASC”;

$data_objects = $wpdb->get_results($sql);
$res = array();
$ar = array();
$fieldset = $like_item . ‘fieldset’;
if($data_objects) {
foreach ($data_objects as $data) {
if ($data->meta_key == $fieldset) continue;
$ar[“$data->meta_key”][]=$data->meta_value;
}
if(count($ar)>0) foreach ($ar as $key => $ar2) {
$i = 0;
foreach ($ar2 as $value) {
$res[$i][$key] = $value;
$i++;
}
}
}

return $res;
}
[/php]

И уже в темплейте используем следующий код:

[php]<?php
$fieldset_data = get_cft_fieldset_data(‘fieldset_name-‘);
?>[/php]

Или вот так:

[php]<?php
$fieldset_data = get_cft_fieldset_data(‘fieldset_name-‘);
if($fieldset_data) :
?>
<?php foreach($fieldset_data as $k => $item) : if(!$item[‘fieldset_name-your_field_name_1’]) continue; ?>
<?php echo $item[‘fieldset_name-your_field_name_1’]; ?>
<?php echo $item[‘fieldset_name-your_field_name_2’]; ?>
<?php endforeach; ?>
<?php endif; ?>[/php]

Решение было найдено на сайте WordPress.org от юзера proximity2008 и немного модифицировано мною.

Конечно, юзер proximity2008 сделал мне головной боли немного, т.к. в процессе выявления ошибок плагина, я понял, что у полей типа file не надо делать blank = true. Это одна из причин того, что файлы не сохраняются.

Другая причина – недоработки в коде плагина. Давайте посмотрим, как можно это исправить.

В файле плагина custom-field-template/custom-field-template.php находим строку 2641 и после неё добавляем следующий код:

[php]$temp[$name]=$data[‘parentSN’];[/php]

Должно получиться вот так:

[php]if ( $data[‘type’] == ‘file’ ) :
$temp[$name]=$data[‘parentSN’];[/php]

Далее после строки 2678 добавляем следующий код:

[php]if($temp) foreach($temp as $key => $psn) $_REQUEST[$key][$psn] = $save_value[$key];[/php]

Вот вроде бы и всё. У плагина всё-равно еще остаются кое-какие баги с добавлением/удалением файлов, но в общем должно работать.

Subscribe
Notify of
103 Comments
Most Voted
Newest Oldest
Inline Feedbacks
View all comments
103
0
Would love your thoughts, please comment.x
()
x