Как создавать произвольные типы записей WordPress. Руководство по кастомным типам записей WordPress Создание полей Meta Box для пользовательских типов записей

A full stack framework that is faster than most if not all micro frameworks. This framework is not for beginners. It gives you the tools, but it"s up to the developer to implement them. If you have a genuine understanding of PHP, and performance is of concern, look no further. The documentation is thorough, but not beginner oriented, and the community is somewhat sparse, but I can"t stress performance enough. This framework puts my PHP applications on a performance level with JAVA applications.

Phlacon is from my point of view not just fastest framework on the market, but also it offers various features and nice components. Also very good to use as MicroFramework for restfull API"s or full MVC framework. Comes with C ORM, and twig template engine. Also what I really appreciate is how the framework is dynamic, you use only what you want, you can simply replace classes and libraries for custom ones or affect flow with events.

Very good job, only one problem is the community but I believe it will grow very fast:)

Phalcon is undoubtedly one of the most fast frameworks out there, and that"s its strong point. On the other hand, the documentation is a bit disorganized, Web tools (code generator) has major issues in Windows, and it is still lacking a bit more of a community to help new developers. But once again, performance, WOW.

Мы также включим функцию редактора записей Custom Fields (пользовательские или произвольные поля) для каждого типа и отобразим поля в новых шаблонах.

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

Но прежде чем мы продолжим, давайте разберёмся с тем, что такое пользовательские записи.

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

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

Обычно вы пишете все ваши публикации в разделе Записи в админ консоли, затем присваиваете им категорию. Все записи различных типов находятся в одном списке, что затрудняет их различие по типу содержимого.

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

В примере выше, если пользователь перейдёт в раздел базы данных фильмов (movie) на вашем сайте, публикации с отзывами (review) не будут включены. Если вы, к примеру, сделаете категории ‘Action’ и ‘Romance’, ваши пользователи смогут пойти в категорию фильмов Action и увидеть все отзывы и фильмы категории.

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

Вы можете изменить различные тексты названий (заданные с использованием массива $labels ), такие как переименовать Add New Post в Add New Movie . Например, вы можете переименовать текст Featured Image (Изображение записи) в Add Poster (Добавить постер) .

Вы также можете включить функцию пользовательских полей в своём редакторе публикаций, которая по умолчанию спрятана и должна быть включена при помощи ссылки Screen Options вверху редактора.

Продолжая пример с Movies и Movie Reviews, публикации Movie могут добавлять пользовательские/произвольные поля для таких параметров как год выпуска, режисёр, рейтинги многие другие с кратким обзором фильмы в виде содержимого записи.

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

Создание новых типов записей

Когда вы создаёте значительные изменения в WordPress, одним из доступных вариантов реализации является создание плагина . Вы также можете создавать новые произвольные типы записей в файле functions.php . Для этого руководства мы создадим плагин и продолжим использовать пример с базой данных movie/reviews (фильмы/отзывы).

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

// The custom function MUST be hooked to the init action hook add_action("init", "lc_register_movie_post_type"); // A custom function that calls register_post_type function lc_register_movie_post_type() { // Set various pieces of text, $labels is used inside the $args array $labels = array("name" => _x("Movies", "post type general name"), "singular_name" => _x("Movie", "post type singular name"), ...); // Set various pieces of information about the post type $args = array("labels" => $labels, "description" => "My custom post type", "public" => true, ...); // Register the movie post type with all the information contained in the $arguments array register_post_type("movie", $args); }

Все пользовательские функции должны иметь префикс, чтобы избежать конфликтов с другими плагинами или функциями темы. Здесь будет использоваться префикс LC.

Два параметра для функции register_post_type() это:

  1. Название типа записи, максимум 20 символов, и не должно содержать пробелов и заглавных букв
  2. Ассоциативный массив, под названием $args , который содержит информацию о типе записи в виде пар ключ значение ‘key’ => ‘value’

Массив $args

Наиболее часто используемые ключи для массива $args показаны ниже, все не являются обязательными:

  • labels – массив array , который задаёт разные фрагменты текста, например ‘Добавить новую запись’ может быть переименована в ‘Добавить новый фильм’. Ключи для массива labels с пояснениями описаны ниже;
  • description – короткое и ёмкое описание типа записи, оно может быть отображено в шаблонах типов, но больше нигде не используется;
  • public – видно ли тип записи для автором и посетителей, значение по умолчанию FALSE, что значит он не появляется даже в Админ консоли;
  • exclude_from_search – будут ли записи этого типа появляться в результатах обычного поиска, значение по умолчанию противоположное значению public;
  • publicly_queryable – можно ли получить запись этого типа с помощью URL-адреса, например, http://www.mywebsite.com/?post_type=movie, или в расширенном использовании через функцию query_posts(). Значение по умолчанию, это значение public;
  • show_ui – подключаются ли ссылки меню и редактор сообщений в панели управления администратора. Значение по умолчанию –public;
  • show_in_nav_menus – будут ли записи этого типа добавляться в меню навигации, созданные на странице Внешний вид ->Меню, значение по умолчанию – это значение public;
  • show_in_menu – отображается ли ссылка типа записи в навигации админ консоли. FALSE – скрывает ссылку. TRUE – добавляет ссылку как новую ссылку верхнего уровня. Ввод строки позволяет разместить ссылку внутри существующей ссылки верхнего уровня, то есть ввести параметры options-general.php располагает её под ссылкой Настройки.
  • show_in_admin_bar – появится ли этот тип записей выше Admin bar, под ссылкой + New
  • menu_position – позиция новой ссылки в меню навигации админ консоли, 5 располагает ниже Записей, 100 располагает ниже Настроек, весь список позиций можно найти в WordPress Codex
  • hierarchical – может ли запись быть назначена к родительской записи, если значение TRUE, то массив $supports должен содержать параметр ‘page-attributes’
  • supports – выборочно включает функции записи такие как: изображения, фрагменты текста, произвольные поля и др. Если установлено в FALSE, то вместо массива выключается редактор для этого типа поста – полезно, если вы хотите закрыть все записи этого типа от редактирования, но оставить видимыми (список значений массива ниэе)
  • taxonomies – массив таксономий, который может быть применён к публикациям этого типа, таксономии должны быть уже зарегистрированными – отсюда они не создаются!
  • has_archive – будут ли у записей этого типа архивные страницы, URL имеет структуру постоянной ссылки и описательная часть URL – это параметр 1 функции register_post_types(), то есть http://www.mywebsite.com/movie_reviews/ покажет все записи movie_review.
  • query_var – TRUE или FALSE определяет, может ли запись быть показанной, вписывая в виде запроса в URL тип записи и имя записи, то есть ‘http://www.mywebsite.com/?movie =the-matrix ‘. Если вы вводите строку текста, нужно располагать текст после символа?, таким образом ‘film’ будет выглядеть в результате как ‘?film =the-matrix ‘.

Массивы labels

Первый ключ в массиве $args называется labels (ярлыки) и должен быть массивом. Он задаёт различные фрагменты текста, относящиеся к типу записи. Так как здесь может быть много данных, лучше всего создать массив с названием $labels для их хранения. Приведенный выше код немного проясняет, что это значит.

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

  • name – общее названия для типа сообщений, например, movies (фильмы)
  • singular_name – название для одной записи этого типа, например, movie (фильм)
  • add_new – замена текста ‘Add New’ (Добавить новую) на указанный текст, например, ‘Add Movie’ (Добавить фильм)
  • add_new_item – замена для ‘Add New Post’ (Добавить новую запись), например, на ‘Add New Movie’ (Добавить новый фильм)
  • edit_item – замена для ‘Edit Post’ (Редактировать запись), например, на ‘Edit Movie’ (Редактировать Фильм)
  • featured_image – замена для ‘Featured Image’ (Изображение записи) в редакторе записи, например, на ‘Movie Poster’
  • set_featured_image – замена ‘Set Featured Image’, к примеру, на такой вариант ‘Add Movie Poster’
  • menu_name – изменение текста ссылки на верхнем уровне, текст для ссылки по умолчанию имя ключа

Массив supports

// Enable specific features in the post editor for my post type $supports = array ("title", "editor", "author", "thumbnail"); // Disable ALL features of the post editor for my post type $supports = FALSE;

Один из ключей в массиве $args называется supports . Это простой массив, где вы записываете список функций редактора записи, которые вы хотите включить для своего типа записи. По умолчанию только название (title) и редактор (editor) включены.

Вы также можете поставить FALSE вместо массива, для отключение всех функций редактора, выключая и title, и область добавления контента. Это означает, что запись не может быть отредактирована, но по прежнему полностью видна.

Вот перечень функций, которые вы можете включить в массиве $supports :

  • title (название)
  • editor (редактор)
  • author – ПРИМЕЧАНИЕ: это позволяет вам изменять автора публикации
  • thumbnail (иконка)
  • excerpt (фрагмент текста)
  • trackbacks (трекбек)
  • custom-fields (произвольное поле)
  • comments (комментарии)
  • revisions (версии)
  • page-attributes (атрибуты страницы)
  • post-formats (форматы записи)

Создание произвольного типа записи WordPress через плагин

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

lc_custom_post_movie() to the init action hook add_action("init", "lc_custom_post_movie"); // The custom function to register a movie post type function lc_custom_post_movie() { // Set the labels, this variable is used in the $args array $labels = array("name" => __("Movies"), "singular_name" => __("Movie"), "add_new" => __("Add New Movie"), "add_new_item" => __("Add New Movie"), "edit_item" => __("Edit Movie"), "new_item" => __("New Movie"), "all_items" => __("All Movies"), "view_item" => __("View Movie"), "search_items" => __("Search Movies"), "featured_image" => "Poster", "set_featured_image" => "Add Poster"); // The arguments for our post type, to be entered as parameter 2 of register_post_type() $args = array("labels" => $labels, "description" => "Holds our movies and movie specific data", "public" => true, "menu_position" => 5, "supports" => array("title", "editor", "thumbnail", "excerpt", "comments", "custom-fields"), "has_archive" => true, "show_in_admin_bar" => true, "show_in_nav_menus" => true, "has_archive" => true, "query_var" => "film"); // Call the actual WordPress function // Parameter 1 is a name for the post type // Parameter 2 is the $args array register_post_type("movie", $args); } // Hook lc_custom_post_movie_reviews() to the init action hook add_action("init", "lc_custom_post_movie_reviews"); // The custom function to register a movie review post type function lc_custom_post_movie_reviews() { // Set the labels, this variable is used in the $args array $labels = array("name" => __("Movie Reviews"), "singular_name" => __("Movie Review"), "add_new" => __("Add New Movie Review"), "add_new_item" => __("Add New Movie Review"), "edit_item" => __("Edit Movie Review"), "new_item" => __("New Movie Review"), "all_items" => __("All Movie Reviews"), "view_item" => __("View Movie Reviews"), "search_items" => __("Search Movie Reviews")); // The arguments for our post type, to be entered as parameter 2 of register_post_type() $args = array("labels" => $labels, "description" => "Holds our movie reviews", "public" => true, "menu_position" => 6, "supports" => array("title", "editor", "thumbnail", "excerpt", "comments", "custom-fields"), "has_archive" => true, "show_in_admin_bar" => true, "show_in_nav_menus" => true, "has_archive" => true); // Call the actual WordPress function // Parameter 1 is a name for the post type // $args array goes in parameter 2. register_post_type("review", $args); }

Ели вы включите этот плагин, то увидите новую ссылку в панели навигации админ консоли, сразу после ссылки Записи.

При наведении мыши будет показаны пункты меню ‘View All’ (Показать все) и ‘Add New’ (Добавить новую), текст будет соответствовать тому, который был задан в массиве $labels . Посмотрите в редакторе, где изменились ссылки.

Ограничение произвольных полей для заданных записей

При добавлении своих полей в запись поля сохраняются и вы можете быстро добавить любое к новой записи. Произвольные поля, которые вы добавили будут появляться в выпадающем списке каждой записи. Это может затруднить поиск нужного поля в определённых типах записей. Если вы хотите ограничить произвольные поля, чтобы они были доступны только для отдельных типов записей, то самый простой способ – через плагин.

get_post_meta()

  • принимает 3 параметра и возвращает результат
  • первый параметр – ID записи, вы можете использовать здесь $post->ID для получения ID текущей отображаемой записи
  • второй параметр – имя произвольного поля записи, чувствительное к регистру
  • третий параметр имеет тип boolean, называется $single и может быть TRUE (возвращает результат в виде строки) или FALSE (возвращает массив).

ПРИМЕЧАНИЕ: Вы можете создать несколько настраиваемых полей с тем же именем и разными значениями. Если существует несколько полей с одинаковым именем, установка FALSE вернёт их массив.

ID, "Box Art", TRUE); if (!empty($movie_box_art)) { ?>
" alt=" ">

Поскольку функция get_post_meta() возвращает значение, вы можете использовать значение в условном выражении для соответствующего изменения внешнего вида.

В примере выше мы проверяем, содержит ли фильм (movie) box art, назначенный ему в виде произвольного поля. Если $movie_box_art не пустое, вывести div и image.

Отображение Advanced Custom Fields

// Display field value the_field("FIELD NAME"); // Return field value get_field("FIELD NAME");

Плагин Advanced Custom Fields предлагает свои собственные функции и шорткоды для отображения полей.

the_field(‘ FIELD NAME’);

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

get_field(‘FIELD NAME’);

Возвращает значение указанного поля, удобно для условных выражений.

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

Шорткоды

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

Отображение произвольного типа записей на главной странице

// Hook our custom function to the pre_get_posts action hook add_action("pre_get_posts", "add_reviews_to_frontpage"); // Alter the main query function add_reviews_to_frontpage($query) { if (is_home() && $query->is_main_query()) { $query->set("post_type", array("post", "movie", "review")); } return $query; }

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

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

$query->set() принимает два параметра:

  • первый параметр – приоритет, который вы хотите изменить, в нашем случае мы изменяем приоритет post_type
  • второй параметр – массив, который вы хотите передать как значение признака post_type

В примере кода выше массив начинается с ‘post’ – вот почему каждая запись WordPress имеет тип ‘post’ и мы всё ещё хотим включить её на главной странице.

Если на главной странице вы хотите использовать только пользовательские записи заданного типа, вы можете удалить‘posts’ и использовать свой собственный тип сообщений.

Значение, которое вы вводите должно соответствовать параметру 1 функции register_post_type() .

Заключение

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

First, from a code organization standpoint, it’d be better to put all of the review logic into one or more includable files and then include it on product pages:

Include("includes/reviews.php");

This way, the product pages can remain unadulterated and the same review code can easily be used, or modified, as needed. The reviews.php script would do several things:

  • Show the review form
  • Handle the review form
  • List the existing reviews
  • Handle secondary actions, such as flagging reviews or comments as inappropriate, indicating that reviews were helpful, adding comments to reviews, indicating that comments where helpful, and so forth

Hopefully you’ve done plenty of web development already, so you know that a form for adding reviews would just be like so:

Review This Product

5 4 3 2 1

Clearly you’d want to use some CSS to make it pretty, but that’s the basic idea. The main catch is that the product ID and product type (or whatever the database must have in order to associate a review with an item) must be stored in hidden inputs. You’d have the PHP script that displays the product write these values to the inputs.

If login is required, you might add (PHP) code that only shows the form to logged-in users, or prints a comment saying the user must log in to review the product. Similarly, if you have a system in place for guaranteeing a person only ever reviews a product once, you’d have PHP check for that scenario before showing this form.

The form submission could go to a new page, but then the user would need to click the Back button to return to the product page, which isn’t ideal. I would instead submit the form back to the product page. For example, on any dynamic website, the same PHP script is used to display all the content of a specific type. In my Effortless E-Commerce with PHP and MySQL book, the first example site uses the page.php script to show any page of content. The action attribute of the form would point to the same page.php . You can accomplish this by just leaving the attribute empty, or by using PHP to dynamically set the value.

If the PHP page that lists the products requires that a value identifying the product be passed in the URL, then the form would need to store that value in a hidden input as well. (That may already be the case, with the product_id input, depending upon how the site is set up.) Secondarily, the product script would also need to be updated to allow for the product value to be received via POST .

For the reviews.php script to know when to handle a form submission, it can check how the script was accessed:

If ($_SERVER["REQUEST_METHOD"] == "POST") { // Handle the form.

When the review form is submitted, the form data should be validated. You should also apply strip_tags() to the data to prevent Cross-Site Scripting (XSS) attacks or other bad behavior. And non-numeric values would be run through an escaping function, such as mysqli_real_escape_string() . Or you could just use prepared statements or stored procedures for better security and performance.

If you add an anchor to the form’s action attribute— action="page.php#reviews "—the user will be taken to the reviews section of the page upon the submission, which is a nice touch.

If the reviews.php script is also handling some of the other actions—inappropriate reviews or comments, helpful indicators, etc.—the script would need to watch for those submissions, too. I would use hidden inputs named “task” to indicate which action is being taken.

In a separate article, I demonstrate how to use Ajax for a simple rating system. Similar Ajax code could be used for the review system, too.

Однажды Вы решили создать свой сайт или блог, а для системы управления Вы выбрали WordPress…Прошло время ваш сайт становится все более и более читаемым и тут, вы поняли, что для ещё большей популярности необходимо добавить немного функционала к сайту или же просто автоматизировать какое-то действие.

Вы идете на «склад» плагинов для wordpress и обнаруживаете, что необходимого плагина для Вас нету. Что же делать? Как быть? Если вы хотя бы немного знакомы с азами программирования на php, верстке, то Вам не составит труда Самому написать плагин для WordPress .

А теперь отправимся на «кухню» для приготовления нашего плагина.

P.s. Если знаний в php и верстке нету… не расстраивайтесь, попросите кого-либо написать Вам нужный функционал 🙂

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

Я не буду дублировать эту информацию, а сразу перейду непосредственно к написанию кода.

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

Первое, что мы сделаем, это придумаем уникальное название нашему плагину - «AdvUserReviews «.

Далее создадим в директории Вашего сайта «/wp-content/plugins/» новую директорию «advuserreviews». И в ней создадим файл «advuserreviews.php». Это будет основной файл, который будет отвечать за общею инициализацию. (Желательно используйте кодировку для файлов UTF-8).

В самом начале файла необходимо указать основную информацию о плагине

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

Наш новый плагин мы будем писать в стиле ООП и вся обработка данных будет находится в одном файле. Создадим основной каркас файла.

// Stop direct call if(preg_match("#" . basename(__FILE__) . "#", $_SERVER["PHP_SELF"])) { die("You are not allowed to call this page directly."); } if (!class_exists("AdvUserReviews")) { class AdvUserReviews { // Хранение внутренних данных public $data = array(); // Конструктор объекта // Инициализация основных переменных function AdvUserReviews() { } } } global $rprice; $rprice = new AdvUserReviews();

Теперь конструктор объекта дополним следующим кодом:

Function AdvUserReviews() { global $wpdb; // Объявляем константу инициализации нашего плагина DEFINE("AdvUserReviews", true); // Название файла нашего плагина $this->plugin_name = plugin_basename(__FILE__); // URL адрес для нашего плагина $this->plugin_url = trailingslashit(WP_PLUGIN_URL."/".dirname(plugin_basename(__FILE__))); // Таблица для хранения наших отзывов // обязательно должна быть глобально объявлена перменная $wpdb $this->tbl_adv_reviews = $wpdb->prefix . "adv_reviews"; // Функция которая исполняется при активации плагина register_activation_hook($this->plugin_name, array(&$this, "activate")); // Функция которая исполняется при деактивации плагина register_deactivation_hook($this->plugin_name, array(&$this, "deactivate")); // Функция которая исполняется удалении плагина register_uninstall_hook($this->plugin_name, array(&$this, "uninstall")); }

В конструкторе объекта мы используем 3 «хука» или «зацепки» (что это?): register_activation_hook , register_deactivation_hook и register_uninstall_hook - это функции, которые выполняются при активации, деактивации плагина и его удаления соответственно.

Теперь непосредственно реализуем эти функции.

/** * Активация плагина */ function activate() { global $wpdb; require_once(ABSPATH . "wp-admin/upgrade-functions.php"); $table = $this->tbl_adv_reviews; // Определение версии mysql if (version_compare(mysql_get_server_info(), "4.1.0", ">=")) { if (! empty($wpdb->charset)) $charset_collate = "DEFAULT CHARACTER SET $wpdb->charset"; if (! empty($wpdb->collate)) $charset_collate .= " COLLATE $wpdb->collate"; } // Структура нашей таблицы для отзывов $sql_table_adv_reviews = " CREATE TABLE `".$wpdb->prefix."adv_reviews` (`ID` INT(10) UNSIGNED NULL AUTO_INCREMENT, `review_title` VARCHAR(255) NOT NULL DEFAULT "0", `review_text` TEXT NOT NULL, `review_date` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, `review_user_name` VARCHAR(200) NULL, `review_user_email` VARCHAR(200) NULL, PRIMARY KEY (`ID`))".$charset_collate.";"; // Проверка на существование таблицы if ($wpdb->get_var("show tables like "".$table.""") != $table) { dbDelta($sql_table_adv_reviews); } } /** * Деактивация плагина */ function deactivate() { return true; } /** * Удаление плагина */ function uninstall() { global $wpdb; $wpdb->query("DROP TABLE IF EXISTS {$wpdb->prefix}adv_reviews"); }

Переменная $wpdb отвечает за запросы к базе Данных. Функция dbDelta анализирует текущую структуру таблицы, сравнивает ee с желаемой структурой таблицы, и либо добавляет или изменяет таблицу по мере необходимости.

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

Основная структура нового плагина готова. Теперь необходимо приступить к написанию функциональной части. Для этого в конструктор класса нам необходимо добавить следующие строчки кода:

// Если мы в адм. интерфейсе if (is_admin()) { // Добавляем стили и скрипты add_action("wp_print_scripts", array(&$this, "admin_load_scripts")); add_action("wp_print_styles", array(&$this, "admin_load_styles")); // Добавляем меню для плагина add_action("admin_menu", array(&$this, "admin_generate_menu")); } else { // Добавляем стили и скрипты add_action("wp_print_scripts", array(&$this, "site_load_scripts")); add_action("wp_print_styles", array(&$this, "site_load_styles")); add_shortcode("show_reviews", array (&$this, "site_show_reviews")); }

Разберем подробнее данный участок кода. Начнем с панели администрирования.
Функция «is_admin » проверяет в каком режиме сейчас мы работаем - на сайте или в панель управления.
Далее используется несколько хуков, для функций:

  • wp_print_scripts - Добавляем необходимые javascript файлы
  • wp_print_styles - Добавляем необходимые стили
  • admin_menu - Добавляем новое меню в панели управления

Каждому хуку соответствует реализованный метод в нашем классе. В котором выполняются необходимые операции.
Рассмотрим код для подключения стилей и скриптов

/** * Загрузка необходимых скриптов для страницы управления * в панели администрирования */ function admin_load_scripts() { // Регистрируем скрипты wp_register_script("advReviewsAdminJs", $this->plugin_url . "js/admin-scripts.js"); wp_register_script("jquery", $this->plugin_url . "js/jquery-1.4.2.min.js"); // Добавляем скрипты на страницу wp_enqueue_script("advReviewsAdminJs"); wp_enqueue_script("jquery"); } /** * Загрузка необходимых стилей для страницы управления * в панели администрирования */ function admin_load_styles() { // Регистрируем стили wp_register_style("advReviewsAdminCss", $this->plugin_url . "css/admin-style.css"); // Добавляем стили wp_enqueue_style("advReviewsAdminCss"); }

Здесь используются следующие функции.

Каждое действие зависит от переданного параметра «action», соответственно «edit» -редактирование отзыва, «submit» - сохранение отредактированного отзыва и «delete» - удаление отзыва.

Обмен данными со страницами отображения происходит через свойство объекта «data». Исходный код этих страниц будет выложен в архиве с данным модулем в конце статьи. Тут я их не буду вставлять, так как топик уже оказался достаточно большим.

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

Что бы указать wordpress, когда вызывать наш плагин, необходимо зарегистрировать «shortcode», что и было сделано в конструкторе нашего класса. Подробнее об этом .

Add_shortcode("show_reviews", array (&$this, "site_show_reviews"));

Теперь на любой странице сайта можно разместить вот такой код и это заставит выполнить указанную нами функцию (передается вторым параметром). Ниже представлен исходный код данной функции.

/** * Список отзывов на сайте */ public function site_show_reviews($atts, $content=null) { global $wpdb; if (isset($_POST["action"]) && $_POST["action"] == "add-review") { $this->add_user_review(); } // Выбираем все отзывы из Базы Данных $this->data["reviews"] = $wpdb->get_results("SELECT * FROM `" . $this->tbl_adv_reviews . "`", ARRAY_A); ## Включаем буферизацию вывода ob_start (); include_once("site_reviews.php"); ## Получаем данные $output = ob_get_contents (); ## Отключаем буферизацию ob_end_clean (); return $output; } private function add_user_review() { global $wpdb; $inputData = array("review_title" => strip_tags($_POST["review_title"]), "review_text" => strip_tags($_POST["review_text"]), "review_user_name" => strip_tags($_POST["review_user_name"]), "review_user_email" => strip_tags($_POST["review_user_email"]),); // Добавляем новый отзыв на сайт $wpdb->insert($this->tbl_adv_reviews, $inputData); }

В принципе тут ничего сложного нету - делается SQL запрос на выборку данных, если же передан параметр «action», то сначала добавляется новый отзыв. Но стоит обратить внимание на буферизацию вывода. Она необходима для того, что бы получить данные вставляемой страницы.

Вот собственно и все. Теперь можно посмотреть, что у нас получилось. А скачать плагин и исходные коды можно вот .

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

Форма на сайте:

Панель управления плагином:

Редактирование отзыва:

Возможно также вам будет интересно:


Понравилась статья? Поделиться с друзьями: