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

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. Для создания набора полей используем следующий код:

[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

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

«your_field_name_1» — имя поля, которое вы меняете на свое.

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

Далее, в файле с вашими функциями (обычно это functions.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
$fieldset_data = get_cft_fieldset_data('fieldset_name-');
?>

Или вот так:

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

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

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

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

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

$temp[$name]=$data['parentSN'];

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

if ( $data['type'] == 'file' ) :
$temp[$name]=$data['parentSN'];

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

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

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

Ну а в поддержку проекта смотрим: Электроника со скидками

This entry was posted in Wordpress Tricks and tagged , , ,