Расширенные динамические пользовательские мета-блоки WordPress - PullRequest
1 голос
/ 23 октября 2010

Я нахожусь в процессе создания плагина, который создает несколько пользовательских типов записей (CPT) (все из которых работают просто отлично). Некоторые из этих CPT требуют «настраиваемой панели записи», которая в основном означает, что она имеет набор настраиваемых мета-блоков, а не стандартное поле редактирования «болота», которое вы получаете с вашими сообщениями или страницами.

Для одного из этих CPT требуется «динамический» набор мета-блоков, который в основном имеет неопределенное количество значений. Я попробую привести пример:

(это не то, чем я занимаюсь, но похоже на достойный пример того, как я бы хотел, чтобы это работало)

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

Размеры, аспект, количество окон и тип пола

Когда пользователь добавил эти данные для первой спальни, если в доме есть вторая спальня, я бы хотел, чтобы у них была кнопка «добавить спальню», и был добавлен еще один набор этих мета-блоков, чтобы они могли заполнить подробности о спальне 2.

Я понимаю, что мне понадобится некоторый javascript, чтобы добавить эту возможность (и что-то, что я не против написать), но в моем бедном, бесполезном мозгу я борюсь за то, как сохранить их в базе данных. Я хочу добиться этого, используя метаданные WordPress, чтобы не добавлять ненужные таблицы базы данных, и я уверен, что это возможно, я просто не могу понять принципы сохранения данных.

Было бы замечательно получить указатели на любые учебные пособия, или некоторые примеры плагинов, которые уже делают подобные вещи, были бы очень благодарны.

Ответы [ 2 ]

2 голосов
/ 29 октября 2010

Вот действительно хорошие статьи по созданию мета-блоков.

Затем, основываясь на вышеприведенных статьях, если вам нужны определенные мета-блоки для каждого пользовательского типа записи, вы можете использовать некоторые операторы if, подобные приведенным ниже, для достижения этой цели.

<code>$post_id = $_GET['post'] ? $_GET['post'] : $_POST['post_ID']; $post = get_post($post_id);<br>
$post_meta = array();<br>
if ($post->post_type == 'hardware') {
 $post_meta[] = array(
    "type" => "text",
    "name" => "Input Example",
    "id" => $shortname."_input_one",
    "desc" => 'Description',
    "std" => '');</p>

<p>} elseif ($post->post_type == 'software') {<br>
 $post_meta[] = array(
    "type" => "textarea",
    "name" => "Text Area Example",
    "id" => $shortname."_textarea",
    "desc" => 'Description.',
    "std" => '',
    "rows" => "3");
 $post_meta[] = array(
    "type" => "text",
    "name" => "Input Example",
    "id" => $shortname."_input_two",
    "desc" => 'Description',
    "std" => '',
    "rows" => "5");
}

$ post_id = ... устанавливает хук, на котором будет основываться ваше утверждение IF.

1 голос
/ 23 октября 2010

Я думаю, что лучший способ сделать это - использовать массивы в формах.Если бы у вас была только коллекция значений, которые были сохранены в post_meta, вы могли бы связать их только с постом (в данном случае с домом), но не с тем, какие измерения соответствуют какому типу пола и т. Д.

имена каждого поля формы что-то вроде спальни [ширина], спальни [num_windows], спальни [bed_type] и т. д., вы будете хранить массив в таблице post_meta, поэтому, когда вы получаете метаданные post для спальни дома, она будетвернуть массив массивов (первый уровень представляет комнаты, второй представляет атрибуты комнаты

Вы можете даже сделать это на шаг дальше, если хотите, и назвать поле спальни [i] [атрибут]где я - счетчик, который вы поддерживаете в JS. Тогда у вас будет только один кусок мета-поста для всех спален

...