Как изменить порядок пользовательских полей формы

12 янв. 2011 г., 22:59:23
Просмотры: 485
Голосов: 0

Я добавил поле "Пользовательский заголовок" в редактор категорий, чтобы сохранять SEO-оптимизированный заголовок, который можно использовать отдельно от названия категории. Поле работает отлично, но отображается последним элементом на экране редактирования категории. В идеале, я хотел бы разместить его под полем "Название" (или хотя бы вверху). Возможно ли это?

Вот код, который я использую для добавления своего поля в форму редактирования категории...

if($pagenow == "edit-tags.php" && $_REQUEST['action'] == "edit") 
add_filter('edit_category_form', 'my_category_fields');

function my_category_fields($tag) {
$tag_extra_fields = get_option(MY_CATEGORY_FIELDS);?>
<table class="form-table">
    <tr class="form-field">
        <th scope="row" valign="top"><label for="categoryTitle">Полный заголовок категории</label></th>
        <td><input name="categoryTitle" id="categoryTitle" type="text" size="40" aria-required="false" value="<?php echo $tag_extra_fields[$tag->term_id]['cat_title']; ?>" />
        <p class="description">Заголовок необязателен, но будет использоваться вместо названия на странице категории.</p></td>
    </tr>   
</table>
<?php
}
3
Комментарии

Я знаю, что это не ответ, но мне интересно, зачем вообще это делать? Это нужно, чтобы отличать удобочитаемое название категории от SEO-оптимизированной версии, которую вы используете в шаблоне?

internetross internetross
12 янв. 2011 г. 23:38:02

По сути, да. Стандартное поле "Name" хорошо подходит для списков, например, когда кто-то добавляет виджет "Category" в боковую панель. Однако при просмотре страницы категории более описательный заголовок работает лучше. Но я бы не использовал этот "Title" в списках, так как стандартное поле "Name" категории для этого более подходит, на мой взгляд.

Scott B Scott B
13 янв. 2011 г. 00:05:24

Я делаю то же самое для заголовков записей. Я использую стандартный заголовок записи/страницы в меню и навигационных списках, но когда приходит время выводить заголовок записи/страницы в single.php или page.php, я использую произвольное поле, которое содержит более описательный (и SEO-дружественный) заголовок.

Scott B Scott B
13 янв. 2011 г. 00:07:13
Все ответы на вопрос 2
4

WordPress не предоставляет нужных хуков, но если вы готовы использовать буферизацию вывода PHP и функцию preg_replace(), вы можете заставить это работать без модификации ядра. Вот ответ, в котором обсуждается необходимая общая техника:

Хуки, которые вам понадобятся: 'category_pre_add_form' для ob_start() и 'category_add_form' для ob_get_clean().

13 янв. 2011 г. 11:02:21
Комментарии

Это интересный вариант, Майк. Также это должно устранить проблему мерцания, присущую варианту с javascript. Как всегда, спасибо!

Scott B Scott B
13 янв. 2011 г. 15:52:46

Отличная идея.

MathSmath MathSmath
13 янв. 2011 г. 21:02:29

@Scott B - Да, я всегда предпочитаю делать на PHP, когда это возможно. Я люблю использовать jQuery для интерактивности, а не как костыль для менее чем идеальной генерации HTML, потому что, как вы упомянули, это намного чище.

MikeSchinkel MikeSchinkel
14 янв. 2011 г. 01:18:03

@MathSmath - Спасибо. У меня был клиент, который очень сильно на меня давил, и я понял, что (почти) всегда есть способ сделать это без взлома ядра. Конечно, это не всегда красиво... :)

MikeSchinkel MikeSchinkel
14 янв. 2011 г. 01:18:58
2

Не существует решения на основе PHP без взлома ядра. Если вы откроете файл wp-admin/edt-tag-form.php, то увидите это. Хук, который вы используете, срабатывает прямо перед кнопкой отправки, а остальная часть формы жестко закодирована.

Но, вероятно, это можно сделать с помощью jQuery. Прочитайте мой ответ на похожий вопрос для примера. Пример приведен для экрана редактирования записи, но концепция должна быть той же — используйте метод jQuery insertBefore() для перемещения элемента (по ID) перед другим элементом (по ID).

13 янв. 2011 г. 00:19:01
Комментарии

Мне нравится ваша идея с использованием jQuery. Но кажется, я застрял, так как поля редактирования категорий (элементы TR) не имеют назначенных ID, которые я мог бы использовать с jQuery.

Scott B Scott B
13 янв. 2011 г. 04:36:54

Подумав ещё раз, раз я хочу вставить свою строку сразу после первой строки этой таблицы, вероятно, я смогу использовать другой способ обхода DOM вместо getElementsByID...

Scott B Scott B
13 янв. 2011 г. 04:39:44