Добавление произвольных полей в категорию WordPress

Сегодня, прекрасная девушка, СЕОшница поставила задачу поменять тайтлы заголовки в категориях на сайте. Та как сайт использует в качестве скелета WordPress, у него нет реализованной возможности изменять заголовки со страницы настроек категорий, но, добавить такую возможность нужно именно туда, а то блондинка девушка-редактор не разберётся )))

Задача — добавить возможность вручную изменять заголовок сайта при отображение страницы категории
Поднажав на поиск в интернет и попробовав пяток (5) найденных плагинов я понял, что придётся реализовывать самостоятельно. Не то, чтоб я был полным противником чужого кода и ярым сторонником всё создавать самостоятельно — нет. Просто, всё, что я пробовал, не легло мне в душу порадовало простотой использования. А, как я уже писал ранее, нужно создать максимальное удобство для редактора!

Алгоритм реализации
  1. Добавить реализацию вывода поля на странице редактирования параметров категории.
  2. Добавить обработку сохранения этого поля в базе данных.
  3. Добавить вывод заголовка страницы, если таковой имеется.

Хочу заметить, что все изменения, а если быть точнее, дополнения будут производиться в файле functions.php Вашей текущей темы оформления.

Расширяем страницу редактирования параметров категории
Добавляем следующий код:
// добавляет вызов функции при инициализации административного раздела
add_action('admin_init', 'category_custom_fields', 1);
// функция расширения функционала административного раздела
function category_custom_fields()
    {
        // добавления действия после отображения формы ввода параметров категории
        add_action('edit_category_form_fields', 'category_custom_fields_form');
        // добавления действия при сохранении формы ввода параметров категории
        add_action('edited_category', 'category_custom_fields_save');
    }

function category_custom_fields_form($tag)
    {
        $t_id = $tag->term_id;
        $cat_meta = get_option("category_$t_id");
?>
        <tr class="form-field">
        <th scope="row" valign="top"><label for="extra1"><?php _e('Cat Title'); ?></label></th>
        <td>
        <input type="text" name="Cat_meta[cat_title]" id="Cat_meta[cat_title]" size="25" style="width:60%;" value="<?php echo
        $cat_meta['cat_title'] ? $cat_meta['cat_title'] : ''; ?>"><br />
                    <span class="description"><?php _e('Title категории'); ?></span>
                </td>
        </tr>
        <?php
    }
    
function category_custom_fields_save($term_id)
    {
        if (isset($_POST['Cat_meta'])) {
            $t_id = $term_id;
            $cat_meta = get_option("category_$t_id");
            $cat_keys = array_keys($_POST['Cat_meta']);
            foreach ($cat_keys as $key) {
                if (isset($_POST['Cat_meta'][$key])) {
                    $cat_meta[$key] = $_POST['Cat_meta'][$key];
                }
            }
            //save the option array
            update_option("category_$t_id", $cat_meta);
        }
    }


name=«Cat_meta[cat_title]» — является определяющим параметром. В данном случае параметр называется «cat_title».

Таким образом, добавляя фрагмент
<tr class="form-field">
<th scope="row" valign="top"><label for="extra1"><?php _e('Cat Title'); ?></label></th>
<td>
    <input type="text" name="Cat_meta[cat_title]" id="Cat_meta[cat_title]" size="25" style="width:60%;" value="<?php echo
        $cat_meta['cat_title'] ? $cat_meta['cat_title'] : ''; ?>"><br />
                    <span class="description"><?php _e('Cat Title'); ?></span>
</td>
</tr>

и изменяя в нём название тега input Вы можете реализовать неограниченное количество произвольных полей для категории.

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

В теме, вместо вывода заголовка
<title>Заголовок</title>
вставим следующий код:
<title>
        <?php 
            if (is_category()){ // если категория
                // получаем ID категории
                $cat_id = get_query_var('cat'); 
                // извлекаем данные из базы данных
                $cat_data = get_option("category_$cat_id"); 
                // выводим данные
                if (!empty($cat_data['cat_title'])){ // если присутствует заголовок
                    echo $cat_data['cat_title']. ' | '; // выводим заголовок
                    bloginfo( 'name' );                 // выводим описание сайта
                }else{                                  // иначе
                    wp_title( '|', true, 'right' ); bloginfo( 'name' ); // выводим стандарный заголовок сайта
                }//if
            }else{
                wp_title( '|', true, 'right' ); bloginfo( 'name' );    // вывод для других страниц сайта
            }//if
        ?>
</title>


Думаю, что ничего особо сложного для понимания в этом коде нет и Вам будет легко с ним разобраться. Спасибо всем, кто осилил дочитать до конца)
  • +1
  • 12 ноября 2012, 18:43
  • igorrius

Комментарии (24)

RSS свернуть / развернуть
Подскажите, а как такой же фокус проделать с тегами?
0
Попробуйте заменить edit_category_form_fields на edit_tag_form_fields и т.д. Я имею ввиду, что нужно заменить везде category на tag. Если получиться, то отпишитесь.
0
Так и было сделано еще до моего вопроса:)

Вставляю вот этот код:

 // добавления действия после отображения формы ввода параметров категории
        add_action('edit_tag_form_fields', 'tag_custom_fields_form');
        // добавления действия при сохранении формы ввода параметров категории
        add_action('edited_tag', 'tag_custom_fields_save');

    }

function tag_custom_fields_form($tag)
    {
        $t_id = $tag->term_id;
        $cat_meta = get_option("tag_$t_id");
?>
        <tr class="form-field">
        <th scope="row" valign="top"><label for="extra1"><?php _e('Cat Title'); ?></label></th>
        <td>
        <input type="text" name="Cat_meta[cat_title]" id="Cat_meta[cat_title]" size="25" style="width:60%;" value="<?php echo
        $cat_meta['cat_title'] ? $cat_meta['cat_title'] : ''; ?>"><br />
                    <span class="description"><?php _e('Title'); ?></span>
                </td>
        </tr>
        <?php
    }
    
function tag_custom_fields_save($term_id)
    {
        if (isset($_POST['Cat_meta'])) {
            $t_id = $term_id;
            $cat_meta = get_option("tag_$t_id");
            $cat_keys = array_keys($_POST['Cat_meta']);
            foreach ($cat_keys as $key) {
                if (isset($_POST['Cat_meta'][$key])) {
                    $cat_meta[$key] = $_POST['Cat_meta'][$key];
                }
            }
            //save the option array
            update_option("tag_$t_id", $cat_meta);
        }
    }



В результате — дополнительное поле на странице описания тега в админке
появляется, но вносимые данные не сохраняются.
0
Посмотрел исходники (сижу на море — извините))) мне кажется, что нужно использовать хук add_tag_form вместо edited_tag или edit_tag_form_pre. Если не получится, пишите, будем разбираться вместе.
0
Попробовал оба варианта — результат тот же
0
Вопрос решен. найдено на буржуйском блоге.
Плюс к вашему рецепту, добавляете эти строки, чтобы
формы появлялись на странице добавления категорий

 add_action( 'create_category', 'category_custom_fields_save'); 
 add_action( 'category_add_form_fields', 'category_custom_fields_form');


Для тегов

add_action('admin_footer_text', 'usage');
// добавляет вызов функции при инициализации административного раздела
add_action('admin_init', 'tag_custom_fields', 1);
// функция расширения функционала административного раздела
function tag_custom_fields()
    {
        // добавления действия после отображения формы ввода параметров категории
        add_action('edit_tag_form_fields', 'tag_custom_fields_form');
        // добавления действия при сохранении формы ввода параметров категории
        add_action('edited_post_tag', 'tag_custom_fields_save');
     add_action( 'create_post_tag', 'tag_custom_fields_save'); 
add_action( 'post_tag_add_form_fields', 'tag_custom_fields_form');
    }

function tag_custom_fields_form($tag)
    {
        $t_id = $tag->term_id;
        $cat_meta = get_option("post_tag_$t_id");
?>
        <tr class="form-field">
        <th scope="row" valign="top"><label for="extra1"><?php _e('Cat Title'); ?></label></th>
        <td>
        <input type="text" name="Cat_meta[cat_title]" id="Cat_meta[cat_title]" size="25" style="width:60%;" value="<?php echo
        $cat_meta['cat_title'] ? $cat_meta['cat_title'] : ''; ?>"><br />
                    <span class="description"><?php _e('Title'); ?></span>
                </td>
        </tr>
        <?php
    }
    
function tag_custom_fields_save($term_id)
    {
        if (isset($_POST['Cat_meta'])) {
            $t_id = $term_id;
            $cat_meta = get_option("post_tag_$t_id");
            $cat_keys = array_keys($_POST['Cat_meta']);
            foreach ($cat_keys as $key) {
                if (isset($_POST['Cat_meta'][$key])) {
                    $cat_meta[$key] = $_POST['Cat_meta'][$key];
                }
            }
            //save the option array
            update_option("post_tag_$t_id", $cat_meta);
        }
    }



Спасибо за статью и быстрый отклик.
+1
Отлично — спасибо!
Значит хук для сохранения — edited_post_tag и create_post_tag.
0
Ребят проблема!)
Сделал все как надо, нашел буржуйскую статью да же, разобрался вроде, а с выводом своего (дополнительного) описания — разобраться не могу вот коды:


// добавляет вызов функции при инициализации административного раздела
add_action('admin_init', 'catalog_custom_fields',5);

// функция расширения функционала административного раздела
function catalog_custom_fields()
    {
        // добавления действия после отображения формы ввода параметров категории
        add_action('catalog_edit_form_fields', 'catalog_custom_fields_form');
        // добавления действия при сохранении формы ввода параметров категории
        add_action('edited_catalog', 'catalog_custom_fields_save');
    }

function catalog_custom_fields_form($tag)
    {
        $t_id = $tag->term_id;
        $cat_meta = get_option("catalog_$t_id");
?>
        <tr class="form-field">
        <th scope="row" valign="top"><label for="extra1"><?php _e('Нижнее Описание'); ?></label></th>
        <td>		
		<textarea name="Cat_meta[cat_title3]" id="Cat_meta[cat_title3]" style="height:108px;"><?php echo $cat_meta['cat_title3'] ? $cat_meta['cat_title3'] : ''; ?></textarea><br />
                    <span class="description"><?php _e('Дополнительное описание категории'); ?></span>
                </td>
        </tr>
        <?php
    }
    
function catalog_custom_fields_save($term_id)
    {
        if (isset($_POST['Cat_meta'])) {
            $t_id = $term_id;
            $cat_meta = get_option("catalog_$t_id");
            $cat_keys = array_keys($_POST['Cat_meta']);
            foreach ($cat_keys as $key) {
                if (isset($_POST['Cat_meta'][$key])) {
                    $cat_meta[$key] = $_POST['Cat_meta'][$key];
                }
            }
            //save the option array
            update_option("catalog_$t_id", $cat_meta);
        }
    }


собственно необходимо вывести cat_title3
+1
Извините, если, что не так сказал)
0
Вроде получилось, но необходимо вместо указанного 5 айдишника получить id текущего каталога.
Никак не выходит, Помогите пожалуйста!)

<?php
	$catid = get_query_var('cat');
	$cat_data = get_option('catalog_5');//"category_$cat_id");
	if (isset($cat_data['cat_title3'])){
	echo '<div class="catalog_image">'.$cat_data['cat_title3'].'</div>';
}	
?>
+1
Что в выводе?
echo $catid = get_query_var('cat');
0
не мог разобраться, вот ответ:
вызвал другую ф-ю сначала этим:
<?php
				$taxonomy = 'catalog';
				$queried_term = get_query_var($taxonomy);
				$terms = get_terms($taxonomy, 'slug='.$queried_term);
				if ($terms) {
				  foreach($terms as $term) {

					global $post;
						$terms = get_the_terms($post->id, $taxonomy);
				  }
				}
			?>

после вывел:
$catid2 = $term->term_id;

и получил:
$cat_data = get_option('catalog_'.''. $catid2);


Сама проблема была между «get_option('catalog_» и "$catid2);" в разметке, а именно в "'.''."
теперь разобрался и понял, что PHP очень чувствительный к ней))
У меня все получилось, Спасибо за статью)))
+1
Получилось и отлично! В PHP кавычки '' и "" имеют отличия. В кавычках "" можно использовать переменные, вместо которых будет подставлено значение.
$a = 'Test1';
echo "---$a"; // даст нам ---Test1

Для одинарных кавычек '' следует пользоваться конкатенацией.
$a = '---'.'Test2';
echo $a; // даст нам ---Test2

Всё это есть в официальном мануле по PHP.
П.С. Рад, что всё получилась и статья помогла. Если будет желание, пишите свои записи в нашей куче) пригодятся и Вам и ещё кому)
0
Сделал как вы написали, все работает отлично. Также сделал для тегов как рекомендовал cognac, но почему-то не работает для тегов, как я понял проблема заключается в header.php. То есть тот код для вывода заголовка, что вы привели в статье работает только для категорий. Не могли бы вы мне помочь?
0
Всё кроется тут
$cat_data = get_option("category_$cat_id"); 

Вам нужно получить верное название категории или тега. Смысл в правильном выборе опции по её имени.
0
Подскажите пожалуйста, что именно здесь изменить или добавить?
<title>
        <?php 
            if (is_category()){ // если категория
                // получаем ID категории
                $cat_id = get_query_var('cat'); 
                // извлекаем данные из базы данных
                $cat_data = get_option("category_$cat_id"); 
                // выводим данные
                if (!empty($cat_data['cat_title'])){ // если присутствует заголовок
                    echo $cat_data['cat_title']. ' | '; // выводим заголовок
                    bloginfo( 'name' );                 // выводим описание сайта
                }else{                                  // иначе
                    wp_title( '|', true, 'right' ); bloginfo( 'name' ); // выводим стандарный заголовок сайта
                }//if
            }else{
                wp_title( '|', true, 'right' ); bloginfo( 'name' );    // вывод для других страниц сайта
            }//if
        ?>
</title>
0
Если честно не собирал у себя тестовую платформу для этого, но попробуйте как то так:
title>
        <?php 
            if (is_category()){ // если категория
                // получаем ID категории
                $cat_id = get_query_var('cat'); 
                // извлекаем данные из базы данных
                $cat_data = get_option("category_$cat_id"); 
                $tag_data = get_option("catalog_$cat_id"); 
                // выводим данные
                if (!empty($cat_data['cat_title'])){ // если присутствует заголовок
                    echo $cat_data['cat_title']. ' | '; // выводим заголовок
                    bloginfo( 'name' );                 // выводим описание сайта
                }elseif(!empty($tag_data)){
                    echo $tag_data['cat_title']. ' | '; // выводим заголовок
                    bloginfo( 'name' );                 // выводим описание сайта
                }else{                                  // иначе
                    wp_title( '|', true, 'right' ); bloginfo( 'name' ); // выводим стандарный заголовок сайта
                }//if
            }else{
                wp_title( '|', true, 'right' ); bloginfo( 'name' );    // вывод для других страниц сайта
            }//if
        ?>
</title>
0
К сожалению не работает
0
А ещё, если сложно разбираться, есть хороший плагин! Называется — Advanced Custom Fields
0
Igorrius, Отличное решение! Но что-то не могу переделать его под Рубрики Таксономии! Прошу тебя о помощи — буду должен!
+1
А что именно не получается??? При создании группы, в выпадающем списке можно выбрать «Термин таксономии» равно «Рубрики». В коде для того, чтобы обратиться к полю для рубрик:
get_field('fieldname', 'category_' . cat_ID; ?>
+1
Данное решение добавляет «Дополнительное поле» в Админке при добавлении/редактировании «Рубрики». Но у меня также есть, другие типы публикации, т.е. таксономия, зарегистрированная в functions.php (register_post_type и register_taxonomy). Чтобы вывести «Дополнительное поле» в рубриках этой таксономии надо как-то переписать это решение, но у меня что-то не получается.
0
Подскажите пож — как переделать под список:
Excerpt 1
Excerpt 2
Content 1
Content 2

А то пробовал переделать неполучается почему то
0
Можно конечно попробовать разобраться) Но это уже точно на следующей неделе. Мы сейчас перешли на очень удобный плагин Advanced Custom Fields. В нём большое количество типов полей и списки, если я не ошибаюсь, есть тоже.
Тут Вам больше расскажет наш автор Maugli , он на этом плагине «собаку съел». Напишите ему в личку)
0
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.
comments powered by Disqus