Отображение метаданных в посте в WordPress

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

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

Одной из практических работ, направленных на закрепление принципов ООП, а также на изучение функций WordPress API, было написание плагина для WordPress.

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

Познакомиться с кодом плагина, его описанием и комментариями, а также загрузить его можно на GitHub.

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

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

Итак, приступим!

Возможные последствия модификации плагина

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

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

Взгляд на метаданные

Метаданные, ассоциированные с постом, хранятся в базе данных. Они попадают туда из разных источников: из ядра системы, из тем, из различных плагинов. И предназначены метаданные для использования только в соответствующем коде и с весьма разнообразными целями.

На иллюстрации, показывающей пример работы нашего плагина, можно заметить поля данных, имена которых начинаются с символа подчёркивания, например, _edit_lock и _edit_last, хранящие числовые значения. Это пример метаданных, используемых ядром WordPress для управления состоянием поста.

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

В чём проблема?

Проблема в том, что отображение всего этого в пользовательском пространстве может давать последнему слишком много информации.

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

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

Именно поэтому я изначально решил, что консоль WordPress – самое подходящее место для отображения метаданных.

И, тем не менее, мы решили это сделать?

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

Ну, и потому, что некоторые умеют учиться только на своих собственных ошибках. В общем, это нормальный процесс обучения.

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

Расширение обработчика метаданных поста

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

Если вы ещё не ознакомились с исходным кодом, самое время сделать это.

Готовы? Теперь – наш план:

  1. Мы возьмём за основу тему по умолчанию «2014»;
  2. Мы создадим общедоступный каталог, который будет отображать метаданные в контексте одного поста;
  3. Мы определим обработчики, которые будут добавлять данные в пост и отображать их в нижней части страницы. Мы создадим и используем для этого рудиментарную таблицу, которая унаследует стили текущей темы. Учтите, что с разными темами результат будет выглядеть по-разному. Конкретные модификации для улучшения внешнего вида нашего плагина вам придётся сделать самостоятельно;
  4. Наконец, для отображения метаданных в посте мы воспользуемся шаблоном, который создали в первоначальной версии плагина.

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

Создание общедоступного каталога

Подразумевая, что тема «2014» уже активна и наш плагин уже установлен, приступим к реализации нового функционала. Прежде всего, мы должны:

  • создать каталог public;
  • создать класс Single_Post_Meta_Manager_Public;
  • добавить класс в базовый код плагина.

Кроме создания файлов, необходимо добавить следующий код в функцию load_dependencies() в файл includes/single-post-meta-manager.php:

private function load_dependencies() {

    require_once plugin_dir_path( dirname( __FILE__ ) ) . 'admin/class-single-post-meta-manager-admin.php';
    require_once plugin_dir_path( dirname( __FILE__ ) ) . 'public/class-single-post-meta-manager-public.php';

    require_once plugin_dir_path( __FILE__ ) . 'class-single-post-meta-manager-loader.php';
    $this->loader = new Single_Post_Meta_Manager_Loader();

}

Фактически, нами была добавлена только одна строка с директивой require_once, импортирующая файл класса в плагин.
Теперь зададим свойства, конструктор и методы класса Single_Post_Meta_Manager_Public:

<?php
/**
 * The Single Post Meta Manager Public defines all functionality for the public-facing
 * sides of the plugin
 *
 * @package SPMM
 */

/**
 * The Single Post Meta Manager Public defines all functionality for the public-facing
 * sides of the plugin.
 *
 * This class defines the meta box used to display the post meta data and registers
 * the style sheet responsible for styling the content of the meta box.
 *
 * @since    1.0.0
 */
class Single_Post_Meta_Manager_Public {

    /**
     * A reference to the version of the plugin that is passed to this class from the caller.
     *
     * @access private
     * @var    string    $version    The current version of the plugin.
     */
    private $version;

    /**
     * Initializes this class and stores the current version of this plugin.
     *
     * @param    string    $version    The current version of this plugin.
     */
    public function __construct( $version ) {
        $this->version = $version;
    }

    /**
     * Uses the partial located in the admin directory for rendering the
     * post meta data the end of the post content.
     *
     * @param    string    $content    The post content.
     * @return   string    $content    The post content including the given posts meta data.
     */
    public function display_post_meta_data( $content ) {

        ob_start();

        require_once plugin_dir_path( dirname( __FILE__ ) ) . 'admin/partials/single-post-meta-manager.php';
        $template = ob_get_contents();
        $content .= $template;

        ob_end_clean();

        return $content;

    }

}

Теперь нам нужно задать функцию-обработчик общедоступного интерфейса нашего плагина при помощи вызова define_public_hooks(). Это делается так:

<?php
/**
 * Defines the hooks and callback functions that are used for rendering information on the front
 * end of the site.
 *
 * This function relies on the Single Post Meta Manager Public class and the Single Post Meta Manager
 * Loader class property.
 *
 * @access    private
 */
private function define_public_hooks() {

    $public = new Single_Post_Meta_Manager_Public( $this->get_version() );
    $this->loader->add_action( 'the_content', $public, 'display_post_meta_data' );

}

Вызовем эту функцию из конструктора класса. Следующей строчкой после $this->define_admin_hooks(); добавим $this->define_public_hooks();.

Если всё было сделано правильно, вы сможете активировать плагин и увидеть в каждом посте те же метаданные, которые отображаются в консоли:

Создание общедоступного каталога

Итоги

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

Таким образом, польза от сегодняшнего урока двояка:

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

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

РедакцияПеревод статьи «How To Display Post Meta Data on a WordPress Post»