Меню
Бесплатно
Главная  /  Скайп  /  Произвольный тип записей в WordPress — register_post_types, register_taxonomy. Полное руководство по пользовательским типам постов в WordPress Переименование заголовков типа записи

Произвольный тип записей в WordPress — register_post_types, register_taxonomy. Полное руководство по пользовательским типам постов в WordPress Переименование заголовков типа записи

От автора: Дни, когда WordPress был просто системой для блогов, прошли. Возможность расширения функционала с помощью плагинов и тем, группировка постов, структурирование данных по типам, а также появление в ядре WP Rest API привели к эволюционированию WordPress в полномасштабную систему управления контентом и платформу разработки.

За эти годы я успешно создал большое количество кастомных веб-приложений на новейших версиях WordPress, в которых по полной использовались кастомные типы постов. Примером может послужить сайт theme marketplace моего плагина для WordPress ProfilePress .

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

Ну хватит долгих речей, перейдем к основной цели данного урока – изучению всех тонкостей пользовательских типов в WordPress.

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

Определение пользовательского типа постов

WordPress может хранить и отображать множество различных типов контента. Одна часть данного контента называется постом, хотя пост сам по себе является специфическим типом постов. «Все типы постов хранятся в одном месте, в таблице wp_posts базы данных, но посты различаются по колонке post_type»

Post type относится к различным структурированным данным, сгруппированным вместе, и которые обслуживаются в базе данных WordPress в таблице posts.

Примером типа постов служит тип post (группа постов из блога), page (группа страниц), attachment (группа загружаемых медиа файлов), а также revision (группа редакций постов). Все эти типы родные или встроенные в WordPress. Зная, что такое тип поста, можно создать и зарегистрировать новый тип, который будет относиться к кастомным типам постов.

Если вы создаете сайт для компании или бизнеса на WordPress, то типами постов могут быть Portfolio, Testimonials и Products. Теперь, когда мы разобрались с концепцией пользовательских типов постов, давайте научимся их создавать.

Как создать пользовательский тип постов

Создать пользовательский тип постов довольно просто. Сперва, необходимо зарегистрировать тип при помощи функции register_post_type(), затем поместить его в функцию и прикрепить все это к экшену init:

function portfolio_cpt() { $args = array("label" => "Portfolio", "public" => true,); register_post_type("portfolio", $args); } add_action("init", "portfolio_cpt");

function portfolio_cpt () {

$ args = array (

"label" = > "Portfolio" ,

"public" = > true ,

register_post_type ("portfolio" , $ args ) ;

В коде выше можно заметить, что второй параметр функции register_post_type() принимает массив из нескольких обязательных аргументов, которые нужны для создания пользовательского типа поста. Созданный тип Portfolio можно посмотреть в панели администратора.

Необходимо также сказать, что в функции register_post_type() второй аргумент необязательный. Пользовательский тип постов можно создать и по-другому:

function portfolio_cpt() { register_post_type("portfolio"); } add_action("init", "portfolio_cpt");

function portfolio_cpt () {

register_post_type ("portfolio" ) ;

add_action ("init" , "portfolio_cpt" ) ;

Если создать тип, как показано выше, то он не будет отображаться в панели администратора (хотя к нему по-прежнему можно обратиться по ссылке http://example.com/wp-admin/edit.php?post_type=portfolio“), название также не будет отображаться (label), а уведомления администратора будут такими же, как и для встроенных типов постов. Пробежимся по аргументам массива настройки пользовательских типов и по соответствующим функциям.

Label

Множественное описательное имя типа. К примеру, если создать тип movie, то он должен называться Movies. По умолчанию стоит $post_type – первый параметр в функции register_post_type().

Labels

Массив лейблов для типа постов. Каждая текстовая строка отображается на определенной странице панели администратора. Если плагин создается для публичного пользования, проверьте, чтобы строки были переводимыми.

name: Множественная форма названия типа постов.

singular_name: Форма названий типов постов в единственном числе.

add_new: Пункт меню для добавления нового поста.

add_new_item: При создании нового поста отображается заголовок.

edit_item: Заголовок отображается при редактировании поста.

new_item: Отображается в меню любимых в шапке панели администратора.

search_items: Текст кнопки панели поиска на экране редактирования поста.

not_found: Текст отображается, когда не найдено ни одного поста в поиске через панель администратора.

not_found_in_trash: Текст отображается, когда в корзине нет постов.

Полный список лейблов и их описаний можно найти по ссылке .

Description

Краткое описание типа поста. Я не нашел, где в WordPress можно это задействовать.

Public

В зависимости от Булева значения оно автоматически решит, какие должны быть аргументы, если они не заданы. Если вы хотите контролировать публичные аргументы, можно задать три аргумента:

show_ui: задает, отображать ли экраны панели администратора.

publicly_queryable: задает, можно ли выполнить запросы по этому типу постов со стороны пользователя.

exclude_from_search: должны ли посты появляться в результатах поиска.

menu_position

По умолчанию новый тип постов добавляется после пункта меню «Комментарии» в панели администратора. Но есть возможность передвинуть данный новый пункт меню. К примеру, если задать menu_position значение 70, то ваш пункт меню окажется ниже пункта «Пользователи».

menu_icon

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

"menu_icon" => get_stylesheet_directory_uri() . "/images/portfolio-icon.png",

Hierarchical

С помощью этого аргумента можно задавать иерархию для новых типов. По умолчанию стоит значение false. Если установить true, новые типы станут иерархическими.

Supports

С помощью этого аргумента можно задать массив мета боксов и полей, которые будут появляться на экране во время редактирования или создания нового поста. По умолчанию стоит title и editor. Если задать false, отключится стандартное поведение. Есть несколько возможных опций:

title: Поле ввода текста для создания заголовка поста.

editor: TinyMCE редактор для написания текста поста.

thumbnail: встроенные изображения.

excerpt: Область textarea для отрывка поста.

trackbacks: включение и отключение трекбеков и пингбеков.

custom-fields: кастомные поля input.

comments: включение или отключение комментариев.

revisions: Возможность редакции постов.

post-formats: Добавляет форматы постов

page-attributes: Атрибуты страницы. Важный параметр для иерархических типов постов, можно выбрать родительский пост.

register_meta_box_cb

Добавляет колбэк функцию, которая вызывается при установке мета боксов для формы редактирования. Функция принимает один аргумент $post, в котором хранится объект WP_Post текущего редактируемого поста. Функция особенно полезна для разработчиков. С ее помощью можно создавать пользовательские мета боксы, которые будут отображаться на экране редактирования типа.

"register_meta_box_cb" => "metabox_callback_func",

has_archive

Если установить данный аргумент в true, к кастомным типам постов добавятся архивы. К примеру, новый тип books, если зайти на страницу http://yoursite.com/books, то отобразится список постов по типу books.

Rewrite

С помощью данного аргумента при просмотре одного поста или архива можно задать структуру ссылок данного типа. По умолчанию стоит true и используется переменная $post_type. Чтобы отключить перезапись, необходимо установить данный параметр в false. Для полной ясности разберем пару примеров. Скажем, вы создали новый тип постов review и хотите изменить URL с review на assessment. Аргумент для перезаписи ниже изменит URL с http://example.com/review/harry-potter/ на http://example.com/assessment/harry-potter/ для конкретного поста и http://example.com/review/ на http://example.com/assessment/ для архива данного типа.

false

Всегда при изменении URL в WordPress сохраняйте изменения в панели Настройки >> ссылки для повторного создания правил перезаписи. Параметр slug отвечает за URL, а with_front задает будет структуру ссылки. Все еще не поняли для чего нужен with_front? Разберем пример. Скажем, структура вашей ссылки точно такая же как на изображении ниже с надписью blog на конце.

Если with_front равен false, URL конкретного поста и архива будут выглядеть http://example.com/blog/assessment/harry-potter/ и http://example.com/blog/assessment соответственно, но если задать true, то ссылки к посту и к архиву будут следующие http://example.com/assessment/harry-potter/ и http://example.com/assessment/. Заметили, что в последних ссылках нет blog? Вот в этом разница.

can_export

С помощью данного аргумента можно задать, можно ли экспортировать посты кастомного типа через инструменты WordPress. По умолчанию стоит true.

query_var

С помощью данного аргумента можно контролировать переменные запроса, используемые для получения постов данного типа.
Если задано true, вы сможете запросить кастомный тип book по ссылке example.com/?book=harry-potter, где harry-potter это параметр slug ссылки. Если задать строку, а не true, можно написать так: example.com/?publication=harry-potter.

Нюанс с query_var

Если query_var не задан в аргументе массива регистрации типа, по умолчанию устанавливается значение $post_type, т.е. данный параметр задан всегда, если его принудительно не установить в false.

И тут есть один нюанс. Если значение query_var добавить через строку запроса в URL, всегда будет выдаваться страница 404. Тут нужно прояснить. Скажем, значение query_var равно review, то URL вашего сайта можно указать в любой из следующих форм:

Эти ссылки приведут вас на странице 404. Об этом я узнал по собственному горькому опыту. Когда я столкнулся с этой проблемой я создал тему на WordPress core trac и сообщил об ошибке. У меня ушло несколько недель на то, чтобы разобраться с этой проблемой перед тем, как мне ответила команда WordPress.

Ускоряем настройку пользовательских типов постов с помощью плагинов

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

Custom Post Type UI

Custom Post Type Maker

Заключение

В этом уроке мы узнали, что такое пользовательские типы постов и как их создавать. Эта первая статья из серии о кастомных типах постов в WordPress. В следующем уроке мы научимся настраивать различные уведомления в панели администратора, узнаем, как регистрировать кастомные таксономии к определенным типам постов и как добавлять вкладку контекстной справки на экран пользовательского типа постов.

О произвольных типах записей в Вордпрессе (CPT, Custom Post Types in WordPress), как создать и настроить, добавить категории и теги, как сделать вложенные URL /тип записи/рубрика/запись или http://example.com/post_type/category/post/ .
Тут также описывается, как расширить стандартный функционал WordPress, создав новые типы записей, которые можно использовать в различных целях: добавить собственное порфтолио, картотеку фильмов и музыки, каталог продукции, календарь событий, даже сделать свой небольшой интернет-магазин (потому что для большого лучше пользоваться готовыми решениями навроде WooCommerce) или социальную сеть, и много чего ещё в этом духе.
Вначале общая информация, дальше — частности.

О записях в WordPress: где хранятся в базе данных, и как их получить

Абсолютно все записи в WordPress, про которые чуть ниже, хранятся в одной таблице: wp_posts . Метаданные постов, например, данные из метабоксов , хранятся в таблице wp_postmeta .

Приведу пример, как получить 10 записей типа post (стандартные Записи в панели администратора).
В общих чертах, данные особо запрашивать не надо. В шаблонах они уже предустановлены, например, в single.php данные по записи уже доступны для обработки в цикле

If (have_posts()) { while (have_posts()) { the_post(); // Тут используем данные из цикла, такие как the_title() и т.п. } }

Если данные нужно получить где-то вне цикла или шаблона, используется запрос WP_Query

$args = array("post_type" => "post", // Тип поста: page, attachment, ... "posts_per_page" => 10, // 10 записей за раз); $p = get_posts($args); // Данные можно раскрыть в цикле if (!empty($p)) { foreach ($p as $post) { setup_postdata($post); ?> ">

Данные можно получить посредством SQL запроса:

Global $wpdb; $query = "SELECT * FROM {$wpdb -> posts} WHERE post_type = "post" LIMIT 10"; $p = $wpdb -> get_results($query); exit(print_r($p)); // в $p теперь массив с данными о постах

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

Предустановленные типы записей в WordPress: post, page, attachment, revision, nav_menu_item

Записи или посты (post)

Самая используемая единица из всех типов, что есть в WordPress — Записи (они же посты, post). Используется в роли постов блога и тому подобного. Имеет 2 предустановленных таксономии: рубрики, они же категории (category) и метки, они же теги (post_tag).
Таксономии служат для сортировки и упорядочивания записей.
Рубрики отличаются от меток тем, что имеют древовидную структуру (могут быть вложенными друг в друга).
Метки являются независимыми друг от друга единицами и этим чем-то похожи на Записи.
Также, по умолчанию, из записей формируется RSS лента сайта на Вордпрессе.

Для Записей используются следующие файлы шаблонов (в порядке приоритета):

  1. single-post.php
  2. single.php
  3. singular.php
  4. index.php

Файлы шаблонов ищутся сверху вниз по списку в порядке приоритета. Если файл шаблона найден в теме, используется он, а поиск прекращается.

Страницы (page)

Страницы используются, в основном, в роли служебных страниц, посадочных страниц — лендингов, сборника энциклопедии и тому подобного. Имеют древовидную иерархию, то есть могут быть вложенными друг в друга, что отразится в адресе конечной страницы (ярлыки родительских будут присутствовать в цепочке URL), и в этой роли имеется возможность выставить им приоритет в сортировке.
Чтобы сделать лендинг, вы можете пойти двумя путями:

Создаём специальный шаблон страницы (page)

Где-нибудь внутри темы в корне или её поддиректории создать файл с произвольным названием и расширением php , например, landing.php . Внутри вы можете разместить совершенно любой шаблон, который может быть абсолютно не похож на другие страницы сайта. Но главное, это поместить вот такой код в начало файла:

Template Name — это специальная метка, которая говорит WordPress о том, что этот файл — специальный шаблон.
Теперь при создании и редактировании любой страницы (page) посмотрите в блоке справа с названием Атрибуты страницы, в нём в разделе Шаблон вы можете выбрать наш уникальный лендинг.

Для Страниц (Page) используется следующая иерархия шаблонов. Как и с Записями, указываю в порядке приоритета:

  1. {шаблон}.php
  2. page-{ярлык_страницы}.php
  3. page-{ID_страницы}
  4. page.php
  5. singular.php
  6. index.php

Прикрепления, вложения или аттачменты (attachment)

Служебный тип, предназначенный для хранения информации о файлах (изображениях, аудио, видео и тому подобных), которые загружались через загрузчик в стандартном редакторе WordPress при редактировании Записи, Страницы или подобного: размер, вес, описание, к какому посту или странице прикреплены, и тому подобное.

Получить вложения для последующей манипуляции над ними можно с помощью следующего кода:

$args = array("post_type" => "attachment", // Тип поста: attachment "post_status" => "inherit", // По умолчанию "publish", а с ним вложения не получить, поэтому указываем специальный статус вложения "inherit"); $p = get_posts($args); exit(print_r($p)); // На выходе будем иметь массив с вложениями

Иерархия шаблонов для аттачментов:

  1. {mime-тип}.php
  2. {mime-подтип}.php
  3. {mime-тип-подтип}.php
  4. attachment.php
  5. single.php
  6. singular.php
  7. index.php

Редакции, черновики или ревизии (revision)

Редакции, они же Ревизии — это версии черновиков записей, которые создаются автоматически, пока вы пишете статью в административной панели Вордпресса или сохраняете статью без фактической её публикации.
В процессе написания, для каждой статьи по умолчанию сохраняется каждая версия черновика. Можно сравнить две разные версии, и к нужной можно откатиться назад.
Хранить помногу версий одной и той же статьи — довольно накладно и часто бессмысленно (хотя, наверное, правильнее было бы оставлять всё по умолчанию, регулярно подчищая старые редакции с помощью плагина, например WP Optimize), поэтому число сохраняемых версий Ревизий можно изменить с помощью 2 вариантов:

  1. Использовать фильтр wp_revisions_to_keep
  2. Прописать в wp-config.php //Отключаем ревизии до минимально возможного значения define("WP_POST_REVISIONS", 0);

    Возможные значения:

    • true или -1: сохраняет каждую версию черновика. Вариант по умолчанию
    • false или 0: отключает сохранение черновиков, кроме 1 автосохранения
    • Целое число больше нуля: сохраняется указанное число версий черновиков + 1 автосохранение. Старые версии, не укладывающиеся в указанное число, автоматически удаляются

Элементы навигационного меню (nav_menu_item)

Навигационное меню (nav_menu_item) — это тип записей, который хранит информацию об единице навигации в WordPress. Первый, и пока единственный тип записи, который используется не как остальные типы записей, данные для работы и отображения на сайте получают свои отдельные функции.
Также, навигационные меню по умолчанию не включены. Чтобы их включить, нужно объявить об их поддержке в :

  1. Прописать add_theme_support("menus");
  2. Или зарегистрировать место под меню с помощью register_nav_menu() , тогда поддержка меню включится автоматически

Для получения данных пользуйтесь wp_nav_menu() , потому что WP_Query не будет работать, и это отличительная особенность типа постов nav_menu_item

// Этот код сработает wp_nav_menu(); // Выведет первое зарегистрированное непустое меню // А код ниже работать не будет $args = array("post_type" => "nav_menu_item", // Тип поста: page, attachment, ...); $p = get_posts($args); exit(print_r($p)); // На выходе будем иметь пустой массив

Пользовательский Произвольный тип записи (Custom Post Type, CPT WordPress)

Вот мы и подошли к главному — тому инструменту, который позволяет расширить стандартный блоговый функционал WordPress до бесконечных возможностей: пользовательский произвольный тип записи.
Самый простой пример, как можно зарегистрировать наш новый тип записи sheensay_product

Add_action("init", "sheensay_post_type"); function sheensay_post_type() { register_post_type("sheensay_product", array("labels" => array("name" => "Продукция", "singular_name" => "Продукцию",), "public" => true, // тип записи открыт для поиска и тому подобного "has_archive" => true, // Включаем страницы архивов "supports" => array("title", "editor", "thumbnail", "comments"), // Включаем поддержку заголовка, редактора, миниатюры, комментариев)); }

Здесь sheensay_product — это название нового типа записей. Оно не должно конфликтовать с другими в системе, об этом подробнее ниже.
Также, в этом варианте оно служит ярлыком этого типа записей, то есть присутствует в URL. Если же хотите указать другой ярлык, например продукция , делайте как на примере ниже

Add_action("init", "sheensay_post_type"); function sheensay_post_type() { register_post_type("sheensay_product", array("labels" => array("name" => "Продукция", "singular_name" => "Продукцию",), "public" => true, "rewrite" => array("slug" => "продукция"), // Тут определяется ярлык Custom Post Type "has_archive" => true, "supports" => array("title", "editor", "thumbnail"),)); }

Как правильно подобрать название нового типа записи

В WordPress зарезервированы следующие названия, которые нельзя использовать в качестве имени нового типа записи:

  • attachment
  • revision
  • nav_menu_item
  • action
  • theme
  • order

Также, стоит воздержаться от использования префикса wp_ в начале названия, так как, возможно, это вызовет конфликты с будущими версиями ядра WordPress.
Лучше всего, если вы будете предварять названия произвольными префиксами, связанными с названием вашего сайта, продукта или бренда, например sheensay_product , тогда гарантированно избежите потенциальных конфликтов

Как сделать произвольную таксономию

Произвольные типы записей могут использовать таксономии из записей, например, рубрики (категории) или метки (теги), но можно, чтобы таксономии были свои.

Add_action("init", "sheensay_post_type"); function sheensay_post_type() { // Регистрируем таксономию register_taxonomy("sheensay_product_type", "sheensay_product", array("label" => "Типы", "hierarchical" => true, // Если TRUE, таксономия будет аналогом рубрик (категорий). Если FALSE (по умолчанию), то таксономия станет аналогом меток (тегов). "rewrite" => array("slug" => "тип-продукции"),)); // Регистрируем произвольный тип записи (Custom Post Type) register_post_type("sheensay_product", array("labels" => array("name" => "Продукция", "singular_name" => "Продукцию",), "public" => true, "rewrite" => array("slug" => "продукция"), // Тут определяется ярлык CPT "has_archive" => true, "supports" => array("title", "editor", "thumbnail"), // Включаем поддержку заголовка, редактора, миниатюры)); }

Шаблоны для произвольных типов постов

Всё зависит от того, какого рода информация отображается. Вариантов может быть 3: шаблон конкретной записи, шаблон архивов записей и шаблон таксономий

Шаблон страницы записи

Перечисляются в порядке приоритета

  1. single-{тип_поста}.php
  2. single.php
  3. index.php

Шаблон архива записей

  1. archive-{тип_поста}.php
  2. archive.php
  3. index.php

Шаблон произвольной таксономии

  1. taxonomy-{имя_таксономии}-{имя_термина}.php
  2. taxonomy-{имя_таксономии}.php
  3. taxonomy.php
  4. archive.php
  5. index.php

Здесь имя_таксономии — это sheensay_product_type , а имя_термина — это ярлык той таксономии, что вы создадите в админке.

Как получить данные произвольного типа записей (Custom Post Type WordPress) и отобразить на сайте

Получить данные произвольного типа записей (Custom Post Type) в WordPress для отображения на сайте можно теми же способами, что и обычные Записи и Страницы

$args = array("post_type" => "sheensay_product", // Указываем наш новый тип записи "posts_per_page" => 10,); $p = get_posts($args); foreach ($p as $post) { setup_postdata($post); ?> ">

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

// Подключаем к стандартным "post" и "page" наш "sheensay_product" add_action("pre_get_posts", "add_sheensay_product_in_main_query"); function add_sheensay_product_in_main_query($query) { if (is_archive() && $query -> is_main_query()) $query -> set("post_type", array("post", "page", "sheensay_product")); return $query; }

Готовый класс для создания произвольного типа записей с произвольной таксономией

Ниже представлен класс, с помощью которого вы сможете зарегистрировать любой произвольный тип записей с собственной таксономией, а URL будет иметь вид
http://example.com/продукция/тип/продукт

Чтобы URL формировался, вы должны перейти в настройки постоянных ссылок /wp-admin/options-permalink.php и установить любой отличный от простого вид общих настроек

Ниже сам код класса. Вы можете не вносить в него никаких изменений, а поменять ярлык типа записи можно в самом конце в строке new Sheensay_Product("продукция");
Сам код пишется в или в . Первый вариант предпочтительнее, так как в этом случае, вы не потеряете доступа к контенту нового типа записей при смене активной темы.

post_type = $post_type; /* * Регистрируем Custom Post Type */ add_action("init", array($this, "sheensay_cpt_product")); /* * Фильтруем URL */ add_filter("post_type_link", array($this, "product_permalink_structure"), 10, 2); /* * Чтобы работала пагинация */ add_action("generate_rewrite_rules", array($this, "fix_product_category_pagination")); } function sheensay_cpt_product() { /* * Регистрируем произвольную таксономию к новому типу записей */ register_taxonomy("sheensay_product_type", "sheensay_product", array("label" => "Типы", "hierarchical" => true, "query_var" => true, "rewrite" => array("slug" => $this -> post_type),)); /* * Регистрируем новый тип записи */ $labels = array("name" => "Продукция", // Основное название "singular_name" => "Продукцию", // Добавить "add_new" => "Добавить новую", // Имя ссылки на новую запись в сайдбаре "add_new_item" => "Добавить новую продукцию", // Заголовок в редакторе при добавлении новой записи); $args = array("labels" => $labels, "public" => true, "publicly_queryable" => true, "show_ui" => true, "query_var" => true, "capability_type" => "post", "hierarchical" => false, "menu_position" => null, "supports" => array("title", "editor", "thumbnail", "excerpt"), "rewrite" => array("slug" => $this -> post_type . "/%sheensay_product_type%", "with_front" => false,), "has_archive" => $this -> post_type,); register_post_type("sheensay_product", $args); if (current_user_can("manage_options")) // Вот с этой функцией осторожней. Она сбрасывает все правила определения URL. Лучше её закомментировать после завершения всех работ flush_rewrite_rules(); } function product_permalink_structure($post_link, $post) { if (FALSE !== strpos($post_link, "%sheensay_product_type%")) { $product_type_term = get_the_terms($post -> ID, "sheensay_product_type"); if (!empty($product_type_term)) $post_link = str_replace("%sheensay_product_type%", $product_type_term -> slug, $post_link); } return $post_link; } function fix_product_category_pagination($wp_rewrite) { unset($wp_rewrite -> rules[ $this -> post_type . "/([^/]+)/page/?({1,})/?$"]); $wp_rewrite -> rules = array($this -> post_type . "/?$" => $wp_rewrite -> index . "?post_type=sheensay_product", $this -> post_type . "/page/?({1,})/?$" => $wp_rewrite -> index . "?post_type=sheensay_product&paged=" . $wp_rewrite -> preg_index(1), $this -> post_type. "/([^/]+)/page/?({1,})/?$" => $wp_rewrite -> index . "?sheensay_product_type=" . $wp_rewrite -> preg_index(1) . "&paged=" . $wp_rewrite -> preg_index(2),) + $wp_rewrite -> rules; } } /* * Запускаем класс * В скобках можно определить название ярлыка типа записи */ new Sheensay_Product("продукция");

Теперь в админке вы можете зарегистрировать новую продукцию и их типы

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

Что такое произвольные типы записей в WordPress?

Весь контент сайта “движок” хранит и выводит в виде так называемых записей, каждая из которых относится к определенному типу. Например, Страница относится к типу записей “page ”, а блоговый пост – “post ”. Это стандартные типы данных WordPress, которые уже присутствуют в свежеустановленной копии “движка”. Произвольный же тип – это сгенерированный вручную новый тип контента. В момент его объявления в системе будет зарегистрирован новый тип записей. Приведем примеры случаев, когда необходимо создавать произвольный тип данных:

  • Books (книги),
  • Organizations (организации),
  • People (люди),
  • Products (продукты),
  • Places (места) и др.

Зачем создавать свой тип записей WordPress?

Создание своего типа записей позволит вводить и показывать на сайте контент нужным, специфичным для этой информации, образом. Кроме того, собственный тип данных позволит хранить в базе данных WordPress любой тип информации.

В каких случаях стоит создавать произвольный тип записей?

Обычно создание произвольного типа записей необходимо для контента, вывод которого не вписывается в рамки встроенных типов (Записей и Страниц ). Более того, новый тип позволит добавить к записям нужные опции (например, имена, адреса, телефонные номера и пр.)

Плагины для работы с произвольными типами записей

Произвольные (нестандартные) типы записей в WordPress можно создать двумя путями: с помощью плагина или вручную. Последний способ является наиболее трудоемким, так как предусматривает хорошую подготовленность пользователя в языках программирования. Мы же рассмотрим более легкий вариант, решающий ту же задачу, но более простым методом – через админ-интерфейс, не требуя каких-либо знаний в программировании. Для этого разработаны и успешно применяются специальные плагины. Познакомимся с наиболее популярными из них.

Плагин Custom Post Type UI

Дополнение Custom Post Type UI обеспечивает пользователю простой и понятный интерфейс для создания и управления произвольными типами данных в WordPress. Среди основных его преимуществ можно выделить:

  • возможность добавления произвольных типов к встроенным или другим созданным вручную;
  • поддержка разного рода опций редактора записей;
  • наличие отдельного списка типов записей, созданных через плагин.

Плагин Custom Post Type UI также имеет негативные стороны, особенно для начинающего WordPress-пользователя:

  • созданные через плагин типы записей придется вручную добавлять в темы;
  • довольно скудное описание возможностей;
  • отсутствие возможности добавления произвольных полей.

Плагин Toolset Types

Плагин Toolset Types , в отличии от предыдущего, позволит Вам добавить произвольные поля и таксономии (категоризацию). Среди его основных возможностей:

  • поддержка расширенных возможностей произвольных типов;
  • возможность управления доступом к полям, которые могут редактировать и просматривать пользователи;
  • наличие всплывающих подсказок по сложным возможностям;
  • возможность создания отношений “родительский – дочерний элементы” между любыми типами;
  • присутствие возможности экспорта/импорта для данных плагина;
  • мультиязычность;
  • возможность повторения всех полей.

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

Плагин Custom Post Types and Custom Fields creator – WCK

WCK Custom Post Type Creator – очередной плагин для создания и управления произвольными типами записей WordPress, обеспечивающий удобный и понятный интерфейс. Плюсы дополнения:

  • простота и понятность интерфейса;
  • возможность создания и поддержки произвольных типов записей, таксономий и произвольных полей, а также мета-полей для записей, страниц и произвольных типов записей;
  • наличие краткого руководства для начала работы.

Плагин Custom Post Type Maker

Custom Post Type Maker – WordPress-плагин, позволяющий создавать произвольные типы записей и таксономии с максимальным удобством для пользователя. Решение полностью интегрировано с WordPress API и обеспечивает поддержку практически всех параметров Custom Post Type API . Имеет ряд преимуществ:

  • наличие продуманного интерфейса с отдельными секциями Post Types и Taxonomies ;
  • присутствие интерфейса для управления произвольными типами записей, такими как обычные записи и страницы;
  • предоставляет все необходимые возможности для создания и управления произвольными типами записей;
  • обеспечивает возможность задавать практически все параметры Custom Post Type API .

Среди недостатков плагина можно выделить отсутствие возможности вывода произвольных типов записей и таксономий.

Плагин CPT-onomies

CPT-onomies – плагин для создания произвольных типов записей, совместимый с мультисайтами в WordPress. Позволяет создавать мощные таксономии и отношения между записями. Среди преимуществ можно выделить:

  • возможность использования таксономий;
  • возможность создания отношений между записями;
  • поддержка регистрации других произвольных типов записей, создаваемых плагинами и темами WordPress;
  • полная поддержка мультисайтов. Есть возможность регистрации произвольных типов записей и таксономий по всей сети или только для определенных сайтов.

Плагин давно не обновлялся, поэтому не так популярен между WordPress-пользователями.

Плагин MB Custom Post Type

Плагин MB Custom Post Type позволяет создавать произвольные типы записей и таксономии, обеспечивая легкое управление ими, благодаря понятному интерфейсу. Среди плюсов дополнения можно выделить следующие:

  • поддержка всех аргументов типа post ;
  • удобство в использовании;
  • поддержка режима live-редактирования, который автоматически заполняет все необходимые метки;
  • поддержка импорта/экспорта для созданных типов записей;
  • возможность расширения функционала при помощи аддонов.

Для работы MB Custom Post Type необходима установка плагина Meta Box .

Плагин Custom Post Type Generator

Custom Post Type Generator – простое и понятное решение, позволяющее генерировать произвольные типы записей из консоли WordPress. Плагин обеспечивает:

  • простой интерфейс;
  • возможность генерации PHP -кода для включения произвольных типов записей и таксономий в темы и плагины;
  • отдельный вывод произвольных типов записей, встроенных типов и типов, поддерживаемых темой.

Недостатком Custom Post Type Generator является отсутствие вывода зарегистрированных типов записей и таксономий в списке редактируемых объектов.

Плагин Pods – Custom Content Types and Fields

С помощью плагина Pods Вы сможете создавать практически любой тип контента вне зависимости от его сложности. Благодаря удобному интерфейсу, можно легко управлять произвольными полями и типами контента. Преимущества решения:

  • понятный интерфейс;
  • наличие большого количества опций;
  • возможность создания произвольных типов записей, произвольных таксономий, страниц настроек и пр.;
  • возможность добавления произвольных полей к произвольным таксономиям;
  • создание расширенных типов контента, которые будут использовать свои собственные таблицы в базе данных;
  • возможность расширения уже существующих типов контента, таких как типы записей, таксономии, медиа, пользователи, комментарии.

Единственным минусом Pods является сложность для начинающего WordPress-пользователя, учитывая наличие подробной документации.

$post_type (строка ) то, как вы хотите назвать свой тип поста, это название в дальнейшем будет использоваться в параметрах многих функций, учтите это. Кроме того, нельзя использовать в качестве названий следующие зарезервированные вордпрессом слова:

  • attachment
  • revision
  • nav_menu_item
  • custom_css
  • customize_changeset
  • action
  • order
  • theme
  • author
$args (массив ) включает в себя следующие параметры: labels (массив ) позволяет подписать элементы интерфейса данного типа записи. Подробнее в примере в конце поста. description (строка ) описание регистрируемого типа записей. Насколько мне известно, этот параметр не используется где-либо в движке WordPress или в стандартных плагинах и темах. Но вполне может использоваться в сторонних плагинах или темах. public (логическое ) обобщает следующие несколько параметров, устанавливая для них соответствующие значения по умолчанию publicly_queryable (логическое ) нужно ли элементы данного типа записей сделать доступными на сайте. Подробнее про задачу этого параметра .
По умолчанию: значение аргумента public . exclude_from_search (логическое )
  • true — исключить записи данного типа из результатов поиска на сайте,
  • false — не исключать.

По умолчанию: противоположные значения параметра public . show_in_nav_menus (логическое ) нужно ли элементы данного типа записей сделать доступными для добавления в меню сайта.
По умолчанию: значение аргумента public . show_ui (логическое ) нужно ли добавлять стандартный интерфейс в админке для редактирования и добавления записей данного типа.
По умолчанию: значение аргумента public .

Show_in_menu (логическое |строка ) нужно ли добавлять пункты в меню админки.

По умолчанию: значение аргумента show_ui . show_in_admin_bar (логическое ) нужно ли добавлять ссылку на создание новой записи данного типа в админ панель.

По умолчанию: значение аргумента show_in_menu . menu_position (целое число ) порядок расположения в меню в админке.

menu_icon (строка ) абсолютный URL иконки для меню. Оптимальное разрешение изображения 16×16 пикселей.

Кроме того, в WordPress 3.8 появился встроенный пакет иконок — вы можете использовать любую из этих иконок, просто указав её название в качестве значения параметра, например dashicons-cart .

По умолчанию используется иконка обычных записей. delete_with_user (логическое ) при удалении пользователя на блоге, нужно ли автоматически удалять все записи данного типа, которые он опубликовал.
По умолчанию: false . hierarchical (логическое ) должен ли данный тип постов иметь иерархию.
По умолчанию: false . has_archive (логическое |строка ) должен ли данный тип постов иметь собственную страницу архивов. В качестве значения параметра можно указать ярлык страницы архивов.
По умолчанию: false . rewrite (массив |логическое ) устанавливает правила для постоянных ссылок в URL. Если в качестве значения данного параметра указать false , то правила для постоянных ссылок создаваться не будут.

Slug (строка ) ярлык, используемый для записей данного типа (по умолчанию — название типа поста) with_front (логическое ) нужно ли добавлять в постоянные ссылки значение $wp_rewite->front (по умолчанию — true) feeds (логическое ) нужно ли создавать RSS ленту для данного типа поста (по умолчанию — значение параметра has_archive) pages (логическое ) нужно ли разрешить постраничную навигацию в постах регистрируемого типа, используя тег (по умолчанию — true) supports (массив ) какие нужно добавить на страницы редактирования записей данного типа.

  • title — поле для ввода заголовка поста
  • editor — текстовый редактор
  • excerpt — метабокс «Цитата»
  • author — метабокс «Автор»
  • thumbnail — метабокс «Миниатюра записи» (кроме того, ваша тема должна их поддерживать)
  • comments — метабокс «Комментарии» (если указано, то разрешены комментарии к постам регистрируемого типа)
  • trackbacks — метабокс «Отправить обратные ссылки»
  • custom-fields — метабокс «Произвольные поля» (произвольные поля будут поддерживаться в любом случае)
  • revisions — метабокс «Редакции» (если указано, то в базе данных будут создаваться редакции постов данного типа)
  • page-attributes — метабокс «Атрибуты страницы» с возможностью выбора родительского эоемента и установления порядка menu_order
  • post-formats — метабокс «Формат», про форматы постов читайте подробнее .
  • taxonomies (массив ) массив таксономий, например category или post_tag , которые будут использоваться для данного типа записей. Присвоить таксономии можно также при помощи функции .

    Пример регистрации типа поста

    Если не знаете, куда вставлять код — вставляйте в functions.php вашей текущей темы.

    add_action ( "init" , "true_register_products" ) ; // Использовать функцию только внутри хука init function true_register_products() { $labels = array ( "name" => "Товары" , "singular_name" => "Товар" , // админ панель Добавить->Функцию "add_new" => "Добавить товар" , "add_new_item" => "Добавить новый товар" , // заголовок тега </span> "edit_item" => <span>"Редактировать товар" </span>, "new_item" => "Новый товар" , "all_items" => "Все товары" , "view_item" => <span>"Просмотр товаров на сайте" </span>, "search_items" => "Искать товары" , "not_found" => <span>"Товаров не найдено." </span>, "not_found_in_trash" => <span>"В корзине нет товаров." </span>, "menu_name" => "Товары" <span>// ссылка в меню в админке </span> ) ; $args = array ( "labels" => $labels , "public" => true , <span>// благодаря этому некоторые параметры можно пропустить </span> "menu_icon" => "dashicons-cart" , <span>// иконка корзины </span> "menu_position" => 5 , "has_archive" => true , "supports" => array ( "title" , "editor" , "excerpt" , "thumbnail" , "comments" ) , "taxonomies" => array ("post_tag" ) ) ; register_post_type("product" ,$args ) ; } </td> </tr></table><p><span class="koXPsjWcBis"></span></p></ul> <p>a! Система управления сайтом <b>WordPress </b> завоевала признание в течении нескольких лет, но настоящим прорывом стала реализация возможности разделять записи на типы. В этом уроке подробно рассмотрим пользовательские типы записей их создание и использование.</p> <h3>Немного истории</h3> <p>На практике, пользовательские типы записей появились достаточно давно, а точнее с 17 февраля 2005 года, когда в <b>WordPress 1.5 </b> была добавлена ​​поддержка пользовательских типов для статических страниц, посредством post_type поля в базе данных. Функция Wp_insert_post() была примерно с <b>WordPress 1.0 </b> так что, когда поле post_type было реализовано в 1.5, можно было достаточно просто заполнить его с помощью этой функции.</p> <p>И только в версии 2.8 появилась функция register_post_type() для создания пользовательских типов и некоторые другие полезные вещи были доступны в «ночных сборках», а уже с 2.9 функции стали доступны всем.</p> <h3>А что сейчас?!</h3> <p>Пользовательский тип записи это не более чем обычная запись (статья) с определенным значением поля post_type в базе данных. В обычной записи поле post_type имеет значение <b>post </b>, страница имеет значение <b>page </b> и так далее. Однако теперь мы можем создавать свои собственные типы, чтобы указать особенности контента, содержащегося в записи. Можно создать пользовательские типы записей для книг, фильмов, анекдотов, продуктов и всего чего угодно.<br> Если все сделано правильно, то с помощью всего лишь нескольких строк кода можно достичь следующих результатов:</p> <ul><li>Вынести пользовательский тип на основную панель админ зоны с пунктами подменю: список всех записей с таким типов, а также создать новую запись с таким типом;</li> <li>Создать архив записей подобного типа, то есть сделать что-то на подобии главной страницы для пользовательского типа;</li> <li>Создать категории и теги, которые могут быть доступными для пользовательских типов записей, а также пользовательские таксономии.</li> </ul><p>Различные типы контента предъявляют различные требования к данным. Для обычных записей вы хотите, чтобы был указан автор, категория и дата. В то время как для записи с типом «книги», хотелось бы иметь возможность указать автора книги, количество страниц, жанр, издательство и другие конкретные данные. Этого легко добиться используя пользовательские (meta boxes) области для ввода данных.</p> <p> — области для ввода дополнительных данных прямо на странице создания записи. Такие области упрощают работу с пользовательскими типами записей.</p><p><img src='https://i0.wp.com/xozblog.ru/wp-content/uploads/2012/11/meta-boxes.jpg' align="center" height="202" width="299" loading=lazy><br></p> <h3>Работа с пользовательскими типами записей</h3> <p>Чтобы эффективно создавать и использовать пользовательские типы записей, Вы должны быть знакомы со следующими составляющими:</p> <ul><li>Создание пользовательских типов записей;</li> <li>Создание пользовательской таксономии;</li> <li>Создание пользовательских областей данных.</li> </ul><h4>Создание пользовательских типов записей</h4> <p>Первое что необходимо сделать, так это создать непосредственно сам пользовательский тип записи. В идеале нужно создать плагин для работы с пользовательскими типами записей, но Вы также можете использовать файл functions.php вашей темы.</p> <table cellspacing="0" cellpadding="0"><tbody><tr><td class="line-numbers"><p>1<br>2<br>3<br>4<br>5<br></p> </td><td><p><br>$args = array () ; <br>} <br></p> </td> </tr></tbody></table><p>Это простейшая форма создания типа, который практически не имеет настроек. Для разработки нового типа наших записей, будем использовать некоторые из наиболее часто используемых опций и добавим их к ранее пустому массиву $args .</p> <table cellspacing="0" cellpadding="0"><tbody><tr><td class="line-numbers"><p>1<br>2<br>3<br>4<br>5<br>6<br>7<br>8<br>9<br>10<br>11<br>12<br>13<br>14<br>15<br>16<br>17<br>18<br>19<br>20<br>21<br>22<br>23<br>24<br>25<br>26<br>27<br></p> </td><td><p>function my_custom_post_product() { <br>$labels = array (<br>"name" => _x( "Продукция" , "post type general name" ) , <br>"singular_name" => _x( "Продукт" , "post type singular name" ) , <br>"add_new" => _x( "Добавить новый" , "product" ) , <br>"add_new_item" => __( <span>"Добавить новый продукт" </span> ) , <br>"edit_item" => __( <span>"Редактировать продукт" </span> ) , <br>"new_item" => __( "Новый продукт" ) , <br>"all_items" => __( "Вся продукция" ) , <br>"view_item" => __( <span>"Смотреть продукт" </span> ) , <br>"search_items" => __( "Найти продукт" ) , <br>"not_found" => __( <span>"Продукты не найдены" </span> ) , <br>"not_found_in_trash" => __( <span>"Нет удаленной продукции" </span> ) , <br>"parent_item_colon" => "" , <br>"menu_name" => "Продукция" <br>) ; <br>$args = array (<br>"labels" => $labels , <br>"description" => <span>"Пользовательский тип записей продукции" </span>, <br>"public" => true , <br>"menu_position" => 5 , <br>"supports" => array ( "title" , "editor" , "thumbnail" , "excerpt" , "comments" , "product_category" ) , <br>"has_archive" => true , <br>) ; <br> register_post_type( "product" , $args ) ; <br>} <br> add_action( "init" , "my_custom_post_product" ) ; </p> </td> </tr></tbody></table> <ul><li><b>labels </b> — данный массив меток используется для описания создаваемого пользовательского типа записи в теме./li></li><li><b>description </b> — краткая информация создаваемого пользовательского типа записи, что он делает и почему мы его используем.</li> <li><b>public </b> — использовать ли пользовательский тип публично и показывать ли его в административной зоне. В данном случае установлено истина.</li> <li><b>menu_position </b> — позиция пункта меню нашего типа на основной панели администратора. Значение 5 значит пункт установиться сразу после пункта меню «Записи», если 10 значит после пункта «Медиафайлы» и тд.</li> <li><b>supports </b> — данная опция содержит массив, в котором описаны те поля которые мы можем редактировать на странице создания записи. То есть title — появится поле для ввода названия записи, editor — будет отображена текстовая область для ввода текста записи и тд. А также указана используемая пользовательская таксономия product_category .</li> <li><b>has_archive </b> — если установлено true, будет создано правило rewrite, позволяя получить список записей нашего типа по адресу http://mysite.com/product/</li> </ul><p><br><img src='https://i0.wp.com/xozblog.ru/wp-content/uploads/2012/11/custom-post-types-1.png' align="center" width="100%" loading=lazy><br></p> <p>После установки этого кода в файл function.php , вы должны увидеть меню для пользовательского типа записей. Появилась возможность добавлять запись и просмотреть список записей.</p> <p>Однако, это далеко не все опции для массива аргументов, полный список опций и все возможности пользовательских типов Вы найдете .</p> <h4>Интерактивные оповещения</h4> <p>WordPress генерирует некоторые сообщения, вызванные действиями пользователя. Мы также можем создать подобные сообщения, чтобы оповестить пользователя при работе с типами. Делается это post_updated_messages .</p> <table cellspacing="0" cellpadding="0"><tbody><tr><td class="line-numbers"><p>1<br>2<br>3<br>4<br>5<br>6<br>7<br>8<br>9<br>10<br>11<br>12<br>13<br>14<br>15<br>16<br>17<br>18<br></p> </td><td><p>function my_updated_messages( $messages ) { <br>global $post , $post_ID ; <br>$messages [ "product" ] = array (<br>0 => "" , <br>1 => sprintf ( __(<span>"Продукт обновлен. Посмотреть" </span><br>2 => __() , <br>3 => __(<span>"Пользовательские поля обновлены." </span>) , <br>4 => __(<span>"Продукт обновлен." </span>) , <br>5 => isset ($_GET [ "revision" ] ) ? sprintf ( __(<span>"Product restored to revision from %s" </span>) , wp_post_revision_title( (int) $_GET [ "revision" ] , false ) ) : false , <br>6 => sprintf ( __(<span>"Продукт опубликован. Посмотреть" </span>) , esc_url( get_permalink($post_ID ) ) ) , <br>7 => __(<span>"Продукт сохранен." </span>) , <br>8 => sprintf ( __(<span>"Продукт отправлен. Посмотреть" </span><br>9 => sprintf ( __(<span>"Продукт запланирован на: <strong>%1$s</strong>. Посмотреть" </span>) , date_i18n( __( "M j, Y @ G:i" ) , strtotime ( $post -> post_date ) ) , esc_url( get_permalink($post_ID ) ) ) , <br>10 => sprintf ( __(<span>"Product draft updated. Посмотреть" </span>) , esc_url( add_query_arg( "preview" , "true" , get_permalink($post_ID ) ) ) ) , <br>) ; <br>return $messages ; <br>} <br> add_filter( "post_updated_messages" , "my_updated_messages" ) ; </p> </td> </tr></tbody></table><p>Обратите внимание, что вы можете задать оповещения для всех пользовательских типов записей с помощью этой одной функции. Если не указывать название типа то оповещения будут использоваться для всех пользовательских типов.</p><p><img src='https://i0.wp.com/xozblog.ru/wp-content/uploads/2012/11/custom-post-types-2.png' align="center" width="100%" loading=lazy><br></p> <p>Контекстные подсказки достаточно редко реализуются и используются. Как пользователь, я никогда не использовал эту возможность, но я уверен, что все же кто-то ими пользуется. Поэтому давайте создадим такую контекстную помощь.<br> Контекстные подсказки находятся в правом верхнем углу, возле вкладки настройки экрана.</p> <table cellspacing="0" cellpadding="0"><tbody><tr><td class="line-numbers"><p>1<br>2<br>3<br>4<br>5<br>6<br>7<br>8<br>9<br>10<br>11<br>12<br>13<br>14<br>15<br>16<br></p> </td><td><p>function my_contextual_help( $contextual_help , $screen_id , $screen ) { <br>if ( "edit-product" == $screen -> id ) { </p><p>$contextual_help = <span>"<h2>Продукция</h2><br> <p>На этой странице находится список всей продукции, которая продается на сайте. Записи расположены в обратном хронологическом порядке, последними в списке являются товары, которые мы добавили первыми.</p> <br> <p>Вы можете просматривать / редактировать сведения о каждом продукте, нажав на его название, или можете выполнить массовые действие с помощью выпадающего меню, выбрав несколько элементов.</p>" </span>; </p><p>} elseif ( "product" == $screen -> id ) { </p><p>$contextual_help = <span>"<h2>Создание/редактирование продукта</h2><br> <p>Эта страница позволяет создать продукт или отредактировать уже имеющиеся данные о нем. Пожалуйста, не забудьте заполнить дополнительные поля.</p>" </span>; </p><p>} <br>return $contextual_help ; <br>} <br> add_action( "contextual_help" , "my_contextual_help" , 10 , 3 ) ; </p> </td> </tr></tbody></table><p>Для того чтобы показать такую подсказку нам необходимо знать идентификатор экрана. Если при создании понадобится узнать ID экрана просто делаем так:</p> <table cellspacing="0" cellpadding="0"><tbody><tr><td class="line-numbers"> </td><td><p>echo $screen -> id ; </p> </td> </tr></tbody></table><p><br><img src='https://i0.wp.com/xozblog.ru/wp-content/uploads/2012/11/custom-post-types-3.png' align="center" width="100%" loading=lazy><br></p> <h3>Пользовательская таксономия</h3> <p>На обычного блога для создания организационной структуры вполне хватает категорий и тегов. В то время как для пользовательских типов постов этого не всегда достаточно. Такую проблему может решить пользовательская таксономия. В нашем случае таксономия с названием «Категории продуктов», которая используется только для записей с пользовательским типов «Продукция».</p> <p>Процесс создания пользовательской таксономии практически идентичен созданию пользовательских типов записей. Давайте посмотрим на нашем примере:</p> <table cellspacing="0" cellpadding="0"><tbody><tr><td class="line-numbers"><p>1<br>2<br>3<br>4<br>5<br>6<br>7<br>8<br>9<br>10<br>11<br>12<br>13<br>14<br>15<br>16<br>17<br>18<br>19<br>20<br>21<br></p> </td><td><p>function my_taxonomies_product() { <br>$labels = array (<br>"name" => _x( <span>"Категории продуктов" </span>, "taxonomy general name" ) , <br>"singular_name" => _x( <span>"Категория продуктов" </span>, "taxonomy singular name" ) , <br>"search_items" => __( <span>"Найти категорию продуктов" </span> ) , <br>"all_items" => __( <span>"Все категории продуктов" </span> ) , <br>"parent_item" => __( <span>"Родительская категория продуктов" </span> ) , <br>"parent_item_colon" => __( <span>"Родительская категория продуктов:" </span> ) , <br>"edit_item" => __( <span>"Редактировать категорию продуктов" </span> ) , <br>"update_item" => __( <span>"Обновить категорию продуктов" </span> ) , <br>"add_new_item" => __( <span>"Добавить новую категорию продуктов" </span> ) , <br>"new_item_name" => __( <span>"Новая категория продуктов" </span> ) , <br>"menu_name" => __( <span>"Категории продуктов" </span> ) , <br>) ; <br>$args = array (<br>"labels" => $labels , <br>"hierarchical" => true , <br>) ; <br> register_taxonomy( "product_category" , "product" , $args ) ; <br>} <br> add_action( "init" , "my_taxonomies_product" , 0 ) ; </p> </td> </tr></tbody></table><p>Как и при создании пользовательского типа мы сформировали массив label, и указали что для создаваемой таксономии актуальна иерархическую структуру (т.е. могут быть родительский и дочерний элементы) — это свойственно рубрикам в обычных записях. В противном случае если структура не иерархическая — созданы обычные теги. Более подробно о таксономии Вы можете почитать .</p><p><img src='https://i0.wp.com/xozblog.ru/wp-content/uploads/2012/11/custom-post-types-4.png' align="center" width="100%" loading=lazy><br></p> <h3>Дополнительные области данных</h3> <p>Дополнительные области или блоки для ввода данных (meta boxes) вы могли видеть на странице редактирования записи. Все знают стандартные , такие как выбор рубрики или тегов. Также в некоторых темах встречаются позволяющие прикрепить картинку к записи и тд.</p> <p>Так как мы создаем пользовательский тип «Продукция», то нам явно понадобится цена продукта, давайте рассмотрим процесс создания пользовательских .</p> <p>Процесс создания можно разделить на 3 этапа:</p> <ul><li>Определение самого блока;</li> <li>Определение содержимого (какие поля присутствуют в блоке);</li> <li>Описание алгоритмов обработки введенных данных.</li> </ul><h4>Определение meta boxes</h4> <table cellspacing="0" cellpadding="0"><tbody><tr><td class="line-numbers"><p>1<br>2<br>3<br>4<br>5<br>6<br>7<br>8<br>9<br>10<br>11<br></p> </td><td><p>add_action( "add_meta_boxes" , "product_price_box" ) ; <br>function product_price_box() { <br> add_meta_box( <br>"product_price_box" , <br> __( "Цена продукта" , "myplugin_textdomain" ) , <br>"product_price_box_content" , <br>"product" , <br>"side" , <br>"high" <br>) ; <br>} </p> </td> </tr></tbody></table><p>Приведенный выше код создает блок со следующими параметрами:</p> <ul><li><b>product_price_box </b> — уникальный идентификатор для meta box (он не обязательно должен совпадать с названием функции);</li> <li><b>Цена продукта </b> — название meta box, которое видит админ на странице;</li> <li><b>product_price_box_content </b> — функция, которая будет отображать содержимое окна;</li> <li><b>product </b> — название пользовательского типа записи, к которому принадлежит meta boxes;</li> <li><b>side </b> — положение блока на странице (side , normal или advanced — по-умолчанию);</li> <li><b>high </b> — приоритет meta boxes (в данном случае «высокий», блок находится в самом верху сайдбара. Варианты: high , core , low или default — по-умолчанию).</li> </ul><h4>Определение содержимого</h4> <table cellspacing="0" cellpadding="0"><tbody><tr><td class="line-numbers"><p>1<br>2<br>3<br>4<br>5<br></p> </td><td><p>function product_price_box_content( $post ) { <br> wp_nonce_field( plugin_basename( __FILE__ ) , ) ; <br>echo <span>"<label for="product_price"></label>" </span>; <br>echo <span>"<input type="text" id="product_price" name="product_price" placeholder="введите цену">" </span>; <br>} </p> </td> </tr></tbody></table><p>Добавляем всего лишь одно поле, для ввода цены продукта. Заметьте название функции совпадает со значением третьего параметра при объявлении (код выше).</p> <h4>Обработка введенных данных</h4> <p>Последний шаг — это сохранение введенной цены на продукт в базу данных.</p> <table cellspacing="0" cellpadding="0"><tbody><tr><td class="line-numbers"><p>1<br>2<br>3<br>4<br>5<br>6<br>7<br>8<br>9<br>10<br>11<br>12<br>13<br>14<br>15<br>16<br>17<br>18<br>19<br></p> </td><td><p>add_action( "save_post" , "product_price_box_save" ) ; <br>function product_price_box_save( $post_id ) { </p><p>if ( defined ( "DOING_AUTOSAVE" ) && DOING_AUTOSAVE ) <br>return ; </p><p>if ( ! wp_verify_nonce( $_POST [ <span>"product_price_box_content_nonce" </span>] , plugin_basename( __FILE__ ) ) ) <br>return ; </p><p>if ( "page" == $_POST [ "post_type" ] ) { <br>if ( ! current_user_can( "edit_page" , $post_id ) ) <br>return ; <br>} else { <br>if ( ! current_user_can( "edit_post" , $post_id ) ) <br>return ; <br>} <br>$product_price = $_POST [ "product_price" ] ; <br> update_post_meta( $post_id , "product_price" , $product_price ) ; <br>} </p> </td> </tr></tbody></table><p>Большая часть функции это проверки. Прежде всего проверяется автосохранение, цена не будет сохранена до тех пор пока не будет нажата кнопка сохранить или обновить. После проверяются права доступа на редактирование данных этой записи и только после этого с помощью функции update_post_meta цена заносится в базу.</p> <h3>Отображение записей созданного типа на блоге</h3> <p>Все этапы создания пользовательского типа записей мы прошли, осталось воспользоваться плодами наших трудов, и сформировать отображение записей на блоге в соответствии с установленной нами таксономией.</p> <p>Так как в процессе создании пользовательского типа мы указали истину для параметра has_archive то список записей типа product доступны по адресу http://mysite.com/product/ .</p> <p>Для отображения используется файл archive-.php (в нашем случае archive-product.php) если такой существует. Иначе, для отображения будет использован archive.php и если такой файл отсутствует в теме, то будет использовать ) <br>) ; <br>$products = new WP_Query( $args ) ; <br>if ( $products -> have_posts () ) { <br>while ( $products -> have_posts () ) { <br>$products -> the_post () ; <br>?> <br>< h1> <?php the_title() ?> </ h1> <br>< div class = "content" > <br><?php the_content() ?> <br></ div> <br><?php <br>} <br>} <br>else { <br>echo <span>"О нет, продукты не обнаружены!" </span>; <br>} <br>?> </p> <h4>Отображение цены</h4> <p>Введенные дополнительные данные, в нашем случае цена продукта, могут быть получены с помощью функции get_post_meta () . Так как мы используем дополнительно поле product_price , то чтобы получить значение цены:</p> <h3>Плагин для создания пользовательских типов записей</h3> <p>Если Вы не уверены в своих силах в области программирования, то всегда можно найти уже готовое решение (плагин) и воспользоваться им. Пользовательские типы не исключение. Плагин <b>WCK Custom Post Type Creator </b> позволяет вам легко создавать пользовательские типы записей для WordPress без знания программирования. </p> <script>document.write("<img style='display:none;' src='//counter.yadro.ru/hit;artfast?t44.1;r"+ escape(document.referrer)+((typeof(screen)=="undefined")?"": ";s"+screen.width+"*"+screen.height+"*"+(screen.colorDepth? screen.colorDepth:screen.pixelDepth))+";u"+escape(document.URL)+";h"+escape(document.title.substring(0,150))+ ";"+Math.random()+ "border='0' width='1' height='1' loading=lazy>");</script> </div> </div> </div> </div> <aside class="col-lg-4 col-md-12 col-md-offset-4 col-lg-offset-0" id="right"> <div> </div> <br/> <div> </div> <br/> <div> </div> <br/> <div> </div> <br/> </aside> </div> </div> </div> <div class="popup" id="share"> <div class="perfect-scroll" style="text-align: center"> <div style="margin-bottom: 20px"> <strong> Скачивание сейчас начнётся...</strong> <br> Не забудьте поделиться материалом <br>в социальных сетях с Вашими <br> коллегами </div> <div> <div class="ya-share2" data-services="vkontakte,facebook,odnoklassniki,moimir,gplus" data-counter=""></div> </div> </div> <div class="close-pop pull-right"> <svg width="10px" height="10px" viewBox="0 0 10 10"> <path fillrule="evenodd" d="M 6.41 5C 6.41 5 9.24 7.83 9.24 7.83 9.63 8.22 9.63 8.85 9.24 9.24 8.85 9.63 8.22 9.63 7.83 9.24 7.83 9.24 5 6.41 5 6.41 5 6.41 2.17 9.24 2.17 9.24 1.78 9.63 1.15 9.63 0.76 9.24 0.37 8.85 0.37 8.22 0.76 7.83 0.76 7.83 3.59 5 3.59 5 3.59 5 0.76 2.17 0.76 2.17 0.37 1.78 0.37 1.15 0.76 0.76 1.15 0.37 1.78 0.37 2.17 0.76 2.17 0.76 5 3.58 5 3.58 5 3.58 7.83 0.76 7.83 0.76 8.22 0.37 8.85 0.37 9.24 0.76 9.63 1.15 9.63 1.78 9.24 2.17 9.24 2.17 6.41 5 6.41 5Z"></path> </svg> </div> </div> <section id="views"> <div class="container"> </div> </section> <script type="text/javascript"> $(document).ready( function () { $('.kursiv').readmore({ speed: 75, maxHeight: 84, heightMargin: 16, moreLink: '<a href="#"><span>Показать полностью</span>', lessLink: '<a href="#"><span>Скрыть</span></a>', } ); } ); </script> <style> div.kursiv { margin-bottom: 0; } #razrabotka { margin-top: 30px; } .readmore-js-toggle { font-style: italic; color: #999; display: inline; margin-right: 10px; font-size: 14px; cursor: pointer; border-bottom: 1px dotted #e6e6e6; } </style></section> <footer> <div class="container"> <div class="row"> <div class="col-xs-16 col-sm-4 col-md-3"> <p>© 2024, udeco-spb.ru, Осваиваем компьютер с удовольствием</p> <div class="social"> <a target="_blank" href="https://vk.com/share.php?url=https://udeco-spb.ru/proizvolnyi-tip-zapisei-v-wordpress-register-post-types-register-taxonomy-polnoe.html"> <svg width="32px" height="19px" viewBox="0 0 32 19"> <path fillRule="evenodd" d="M 15.36 18.01C 15.36 18.01 17.24 18.01 17.24 18.01 17.24 18.01 17.81 17.94 18.1 17.64 18.36 17.37 18.35 16.85 18.35 16.85 18.35 16.85 18.32 14.41 19.49 14.05 20.64 13.7 22.12 16.4 23.69 17.45 24.87 18.23 25.77 18.06 25.77 18.06 25.77 18.06 29.97 18.01 29.97 18.01 29.97 18.01 32.16 17.87 31.12 16.21 31.03 16.07 30.51 14.97 28 12.72 25.37 10.35 25.72 10.74 28.89 6.65 30.82 4.16 31.59 2.65 31.35 2 31.12 1.38 29.7 1.54 29.7 1.54 29.7 1.54 24.98 1.57 24.98 1.57 24.98 1.57 24.63 1.52 24.37 1.67 24.12 1.82 23.95 2.16 23.95 2.16 23.95 2.16 23.21 4.09 22.21 5.72 20.11 9.18 19.27 9.36 18.92 9.15 18.12 8.65 18.32 7.14 18.32 6.07 18.32 2.72 18.85 1.32 17.3 0.96 16.79 0.84 16.41 0.76 15.1 0.75 13.41 0.73 11.99 0.76 11.18 1.14 10.64 1.39 10.23 1.96 10.48 1.99 10.79 2.03 11.5 2.18 11.88 2.67 12.36 3.31 12.34 4.74 12.34 4.74 12.34 4.74 12.62 8.68 11.69 9.17 11.06 9.5 10.18 8.82 8.31 5.68 7.35 4.08 6.62 2.3 6.62 2.3 6.62 2.3 6.48 1.97 6.23 1.8 5.93 1.58 5.51 1.51 5.51 1.51 5.51 1.51 1.02 1.54 1.02 1.54 1.02 1.54 0.35 1.56 0.1 1.84-0.12 2.09 0.08 2.62 0.08 2.62 0.08 2.62 3.6 10.57 7.57 14.57 11.22 18.25 15.36 18.01 15.36 18.01 15.36 18.01 15.36 18.01 15.36 18.01Z"/> </svg> </a> <a target="_blank" href="https://connect.ok.ru/offer?url=https://udeco-spb.ru/proizvolnyi-tip-zapisei-v-wordpress-register-post-types-register-taxonomy-polnoe.html"> <svg viewBox="0 0 25 25" width="25px" height="25px"> <path class="st0" d="M12.5,12.7c3.2,0,5.8-2.6,5.8-5.8c0-3.2-2.6-5.8-5.8-5.8C9.3,1,6.7,3.6,6.7,6.8C6.7,10,9.3,12.7,12.5,12.7z M12.5,3.9c1.6,0,2.9,1.3,2.9,2.9c0,1.6-1.3,2.9-2.9,2.9c-1.6,0-2.9-1.3-2.9-2.9C9.6,5.2,10.9,3.9,12.5,3.9z M19.2,13.4 c-0.3-0.7-1.2-1.2-2.5-0.3c-1.6,1.3-4.3,1.3-4.3,1.3s-2.6,0-4.3-1.3c-1.2-1-2.1-0.4-2.5,0.3c-0.6,1.2,0.1,1.7,1.5,2.7 c1.3,0.8,3,1.1,4.1,1.2l-0.9,0.9c-1.3,1.3-2.6,2.6-3.4,3.4c-0.5,0.5-0.5,1.4,0,1.9l0.2,0.2c0.5,0.5,1.4,0.5,1.9,0l3.4-3.4 c1.3,1.3,2.6,2.6,3.4,3.4c0.5,0.5,1.4,0.5,1.9,0l0.2-0.2c0.5-0.5,0.5-1.4,0-1.9l-3.4-3.4l-0.9-0.9c1.1-0.1,2.8-0.4,4.1-1.2 C19.2,15.1,19.8,14.5,19.2,13.4z"/> </svg> </a> <a target="_blank" href="https://www.facebook.com/sharer/sharer.php?u=https://udeco-spb.ru/proizvolnyi-tip-zapisei-v-wordpress-register-post-types-register-taxonomy-polnoe.html"> <svg width="26px" height="25px" viewBox="0 0 26 25"> <path fillRule="evenodd" d="M 24.33-0C 24.33-0 1.96-0 1.96-0 1.19-0 0.57 0.62 0.57 1.38 0.57 1.38 0.57 23.62 0.57 23.62 0.57 24.38 1.19 25 1.96 25 1.96 25 14 25 14 25 14 25 14 15.32 14 15.32 14 15.32 10.72 15.32 10.72 15.32 10.72 15.32 10.72 11.54 10.72 11.54 10.72 11.54 14 11.54 14 11.54 14 11.54 14 8.76 14 8.76 14 5.53 15.98 3.77 18.88 3.77 20.27 3.77 21.46 3.88 21.81 3.92 21.81 3.92 21.81 7.3 21.81 7.3 21.81 7.3 19.8 7.3 19.8 7.3 18.22 7.3 17.92 8.04 17.92 9.13 17.92 9.13 17.92 11.54 17.92 11.54 17.92 11.54 21.68 11.54 21.68 11.54 21.68 11.54 21.19 15.32 21.19 15.32 21.19 15.32 17.92 15.32 17.92 15.32 17.92 15.32 17.92 25 17.92 25 17.92 25 24.33 25 24.33 25 25.09 25 25.71 24.38 25.71 23.62 25.71 23.62 25.71 1.38 25.71 1.38 25.71 0.62 25.09-0 24.33-0Z"/> </svg> </a> <a target="_blank" href="https://youtube.com/"> <svg width="26px" height="19px" viewBox="0 0 26 19"> <path fillRule="evenodd" d="M 25.75 14.46C 25.75 14.46 25.5 16.18 24.75 16.93 23.79 17.92 22.72 17.93 22.23 17.99 18.71 18.24 13.43 18.25 13.43 18.25 13.43 18.25 6.89 18.19 4.88 18 4.32 17.89 3.06 17.92 2.11 16.93 1.35 16.18 1.11 14.46 1.11 14.46 1.11 14.46 0.86 12.45 0.86 10.44 0.86 10.44 0.86 8.55 0.86 8.55 0.86 6.54 1.11 4.52 1.11 4.52 1.11 4.52 1.35 2.81 2.11 2.05 3.06 1.06 4.14 1.06 4.63 1 8.15 0.75 13.42 0.75 13.42 0.75 13.42 0.75 13.43 0.75 13.43 0.75 13.43 0.75 18.71 0.75 22.23 1 22.72 1.06 23.79 1.06 24.75 2.05 25.5 2.81 25.75 4.52 25.75 4.52 25.75 4.52 26 6.54 26 8.55 26 8.55 26 10.44 26 10.44 26 12.45 25.75 14.46 25.75 14.46ZM 10.83 5.73C 10.83 5.73 10.83 12.72 10.83 12.72 10.83 12.72 17.62 9.24 17.62 9.24 17.62 9.24 10.83 5.73 10.83 5.73Z"/> </svg> </a> </div> </div> <div class="col-lg-2 col-sm-4 col-xs-16 links"> <h4>udeco-spb.ru</h4> <a href="/category/mastering-the-pc/">Осваиваем ПК</a> <a href="/category/social-networks/">Социальные сети</a> <a href="/category/skype/">Скайп</a> <a href="/category/internet/"> Интернет</a> <a href="/category/windows-tutorials/">Уроки по Windows</a> <a href="/category/work-on-the-internet/">Работа в Интернете</a> </div> <div class="col-lg-2 col-sm-3 col-xs-16 links"> <h4>О проекте</h4> <a href="/feedback.html">Обратная связь</a> <a href="">О сайте</a> </div> <div class="col-lg-5 col-sm-1 col-xs-16 links"></div> <div class="col-lg-4 col-sm-5 col-xs-16 links"> </div> </div> <div class="row v-center"> <div class="col-md-8 col-xs-16"> <a data-fancybox data-type="iframe" data-src="/feedback.html">Контакты</a> </div> <div class="col-md-8 col-xs-16"> <div class="share pull-right"> <script type="text/javascript" src="//yastatic.net/es5-shims/0.0.2/es5-shims.min.js" charset="utf-8"></script> <script type="text/javascript" src="//yastatic.net/share2/share.js" charset="utf-8"></script> <div class="ya-share2" data-services="vkontakte,facebook,odnoklassniki,moimir,gplus" data-counter=""></div> </div> </div> </div> </div> </footer> <a href="#bot" id="to-top"> <svg width="50px" height="50px" viewBox="0 0 50 50"> <circle cx="25.00" cy="25.00" r="25.00" fill="rgb(0,0,0)" opacity="0.37"/> <path fillRule="evenodd" d="M 33.94 24.46C 33.94 24.46 25.89 16.3 25.89 16.3 25.32 15.73 24.41 15.73 23.84 16.3 23.84 16.3 15.79 24.46 15.79 24.46 14.88 25.38 15.52 26.97 16.81 26.97 16.81 26.97 20.43 26.97 20.43 26.97 21.23 26.97 21.88 27.62 21.88 28.43 21.88 28.43 21.88 32.51 21.88 32.51 21.88 33.71 22.83 34.68 24.01 34.68 24.01 34.68 25.72 34.68 25.72 34.68 26.9 34.68 27.86 33.71 27.86 32.51 27.86 32.51 27.86 28.43 27.86 28.43 27.86 27.62 28.5 26.97 29.31 26.97 29.31 26.97 32.92 26.97 32.92 26.97 34.21 26.97 34.85 25.38 33.94 24.46Z" fill="rgb(241,241,241)"/> </svg> </a> <div class="overlay"></div> <div class="popup" id="password"> <div class="perfect-scroll"> <h2>Восстановление пароля <div class="close-pop pull-right"> <svg width="10px" height="10px" viewBox="0 0 10 10"> <path fillRule="evenodd" d="M 6.41 5C 6.41 5 9.24 7.83 9.24 7.83 9.63 8.22 9.63 8.85 9.24 9.24 8.85 9.63 8.22 9.63 7.83 9.24 7.83 9.24 5 6.41 5 6.41 5 6.41 2.17 9.24 2.17 9.24 1.78 9.63 1.15 9.63 0.76 9.24 0.37 8.85 0.37 8.22 0.76 7.83 0.76 7.83 3.59 5 3.59 5 3.59 5 0.76 2.17 0.76 2.17 0.37 1.78 0.37 1.15 0.76 0.76 1.15 0.37 1.78 0.37 2.17 0.76 2.17 0.76 5 3.58 5 3.58 5 3.58 7.83 0.76 7.83 0.76 8.22 0.37 8.85 0.37 9.24 0.76 9.63 1.15 9.63 1.78 9.24 2.17 9.24 2.17 6.41 5 6.41 5Z"/> </svg> </div> </h2> <div class="recover-success"> <form action="/recovery/request" data-method="post" method="post" class="recover_form"> <p>Введите вашу электронную почту, чтобы восстановить пароль!</p> <div class="input-wrp"> <input name="email" type="text" placeholder="Введите ваш e-mail"> </div> <input type="submit" data-disable-with="Отправить..." class="btn green" value="Отправить"> </form> </div> <div class="auth-form_error" style="padding-top: 10px"></div> </div> </div> <script> $('.user.one').click(function (e, ob) { $('.user').removeClass('active-user'); $('.user.one').addClass('active-user'); $('#user_type').val('1'); e.stopPropagation(); } ); $('.user.two').click(function (e, ob) { $('.user').removeClass('active-user'); $('.user.two').addClass('active-user'); $('#user_type').val('2'); e.stopPropagation(); } ); $('.user.three').click(function (e, ob) { $('.user').removeClass('active-user'); $('.user.three').addClass('active-user'); $('#user_type').val('3'); e.stopPropagation(); } ); function clearErrors() { $('.auth-form_error').each(function () { $(this).html(''); } ); } $('body').on('click', '.open-login-form', function (e) { $('#register, .overlay').removeClass('visible-pop'); $('#login, .overlay').addClass('visible-pop'); e.preventDefault(); } ); $('body').on('click', '.open-pass-form', function (e) { $('#register, .overlay').removeClass('visible-pop'); $('#password, .overlay').addClass('visible-pop'); e.preventDefault(); } ); $('.login_form') .on('ajax:beforeSend', function (event, xhr, settings) { clearErrors(); } ) .on('ajax:complete', function (event, xhr, status) { } ) .on('ajax:success', function (event, data, status, xhr) { if (data.status == 0) { $('.auth-form_error').html(data.text + '<br>'); } else { $('.open-register').html(data.text); var delay = 1000; window.location.href = url = window.location.href + "?login=ok"; location.replace(url); setTimeout('window.location.reload(true);', delay); } } ).on('ajax:error', function (event, xhr, status, error) { } ); $('.recover_form') .on('ajax:beforeSend', function (event, xhr, settings) { clearErrors(); } ) .on('ajax:complete', function (event, xhr, status) { } ) .on('ajax:success', function (event, data, status, xhr) { console.log(data); if (data.status == 0) { $('.auth-form_error').html(data.text + '<br>'); } else { $('.recover-success').html('<div class="success" >' + data.text + '</div>'); } } ).on('ajax:error', function (event, xhr, status, error) { } ); $('.registration_form') .on('ajax:beforeSend', function (event, xhr, settings) { var emailError = $('#emailError'); var passwordError = $('#passwordError'); var passwordVerify = $('#passwordVerifyError'); var userTypeError = $('#userTypeError'); var emailExist = $('#emailExist'); emailError.html(''); passwordError.html(''); passwordVerify.html(''); userTypeError.html(''); emailExist.hide(); } ) .on('ajax:complete', function (event, xhr, status) { } ).on('ajax:success', function (event, data, status, xhr) { // insert the failure message inside the "#account_settings" element //console.log(data); if (data.status == 0) { //$('.reg-info').html('<div class="error">' + data.text + '</div>'); if (data.text.email) { var emailError = $('#emailError'); var emailExist = $('#emailExist'); console.log(data.text.email); if (data.text.email == 'Найдена совпадающая со значением запись') { console.log('alert'); emailExist.show(); } else { emailError.html('<i class="icon-error"></i><div class="error_note_wrapper">' + '<div class="error_note">' + '<span class="error_note_text">' + data.text.email + '</span></div></div>'); } } if (data.text.password) { var passwordError = $('#passwordError'); console.log(data.text.password); passwordError.html('<i class="icon-error"></i><div class="error_note_wrapper">' + '<div class="error_note">' + '<span class="error_note_text">' + data.text.password + '</span></div></div>'); } if (data.text.passwordVerify) { var passwordVerify = $('#passwordVerifyError'); console.log(data.text.passwordVerify); passwordVerify.html('<i class="icon-error"></i><div class="error_note_wrapper">' + '<div class="error_note">' + '<span class="error_note_text">' + data.text.passwordVerify + '</span></div></div>'); } if (data.text.captcha) { var captcha = $('#captchaError'); console.log(data.text.captcha); captcha.html('<i class="icon-error"></i><div class="error_note_wrapper">' + '<div class="error_note">' + '<span class="error_note_text">' + data.text.captcha + '</span></div></div>'); } if (data.text.userType) { var user_type = $('#userTypeError'); console.log(data.text.userType); user_type.html('<i class="icon-error"></i><div class="error_note_wrapper">' + '<div class="error_note">' + '<span class="error_note_text">' + data.text.userType + '</span></div></div>'); } } else { $('.reg-success').html(data.text); var delay = 2000; window.location.href = url = window.location.href + "?reg=ok"; location.replace(url); setTimeout('window.location.reload(true);', delay); } } ).on('ajax:error', function (event, xhr, status, error) { } ); </script> <div class="popup" id="premium-pop"> </div> <link rel="stylesheet" href="/videouroki/res/lightslider/lightslider.min.css"> <link rel="stylesheet" href="/videouroki/res/perfectScrollbar/perfect-scrollbar.css"> <link rel="stylesheet" href="/videouroki/assets/font-awesome/css/font-awesome.min.css"> <link rel="stylesheet" href="/assets/vendor/fancybox/jquery.fancybox.min.css"> <script src="/videouroki/res/perfectScrollbar/perfect-scrollbar.jquery.min.js"></script> <script src="/js/rails.js"></script> <script src="/videouroki/res/lightslider/lightslider.min.js"></script> <script src="/videouroki/res/jquery.validate.min.js"></script> <script src="/videouroki/res/autosize-master/autosize.min.js"></script> <script src="/videouroki/js/tabs.js"></script> <script src="/videouroki/js/select.js"></script> <script src="/videouroki/js/global.js?2109"></script> <script src="/videouroki/js/views.js"></script> <script src="/videouroki/plugin/notify/notify.min.js"></script> <script src="/videouroki/plugin/notify/notify-metro.js"></script> <script src="/videouroki/js/lazyload.min.js"></script> <script src="/assets/vendor/fancybox/jquery.fancybox.min.js"></script> <script type="text/javascript"> $(document).ready( function () { // new LazyLoad(); } ) </script> <!--[if gte IE 9]><script type="text/javascript" src="/videouroki/assets/ckeditor-mini/ckeditor.js"></script><![endif]--> <script type="text/javascript" src="/videouroki/js/readmore.js"></script></body> </html>