Создаем плагин для реализации «книжной полки» в WordPress
В данном учебном руководстве мы рассмотрим процесс создания плагина, позволяющего выводить все книги и пособия в виде изображений, которые будут появляться на импровизированной «книжной полке». Пример такого вывода можно видеть на сайте Smashing Magazine в разделе eBooks. Базовая функциональность WordPress, необходимая для реализации указанного действия, будет продемонстрирована в руководстве – вы сможете легко ее использовать в своих проектах.
В данной статье мы расскажем, как создать типы записей, шорткоды и мета-поля с помощью базового функционала WordPress, а также как скомпоновать их в один рабочий плагин. Для начала мы объясним, как зарегистрировать плагин, как разработать бэкэнд-функциональность и как создать фронтэнд-вывод с помощью шорткодов.
Установка плагина
Стандартный метод регистрации плагина в WordPress состоит в следующем – вы должны добавить специальную информацию в заголовок файла. Создайте файл под названием sm_books.php и добавьте к нему данные, представленные ниже. Обратите внимание на то, что в данном случае регистрируемой информацией будет являться “Plugin Name,” “Author,” “Version,” и т.д. Все эти данные требуются для активации плагина и управления им на соответствующей странице панели администратора.
<?php /* Plugin Name: SM Books Plugin URI: http://b4ucode.com Description: Displays Books and books Author: B4uCode Version: 1.0.0 Author URI: http://b4ucode.com */
Регистрация типов записи
Чтобы добавить книжную систему, нам понадобится зарегистрировать новый произвольный тип записей с помощью функции register_post_type. Чтобы получить доступ к ней, мы инициируем ее посредством функции add_action. Добавьте следующий код к файлу sm_books.php:
//Register Book Post Type add_action( 'init', 'create_sm_book_type' ); function create_sm_book_type() { register_post_type( 'sm_books', array( 'labels' => array( 'name' => __( 'Books' ), 'singular_name' => __( 'Book' ) ), 'public' => true, 'has_archive' => true, 'supports' => array('title','editor','thumbnail') ) ); }
Данный сниппет является основным способом создания типа записей. Функция register_post_type( $post_type, $args ) получает два параметра: $post_type и $args. Первый параметр представляет собой 20-символьную строку, которая используется для названия нового типа. Стандартные типы записей в WordPress: “Post,” (запись) “Page,” (страница) “Attachment,” (прикрепление) “Revisions” (редакции) и “Navigation Menus.” (навигационные меню). Эти стандартные названия не могут быть использованы при создании произвольного типа данных. Мы остановимся на названии sm_books. Второй параметр (необязательный) – это массив, который хранит в себе различные опции для произвольного типа. Массив поддерживает «метки», которые мы будем использовать в sm_books наряду с другими опциями, доступными для типа записей – exclude_from_search, show_ui и т.д.
Добавление рубрики
В данном руководстве мы хотим добавить произвольный набор рубрик для книг. Этот набор называется «таксономией» – мы создадим его с помощью с помощью функции register_taxonomy, которую мы назовем sm_book_category. Рубрики помогут нас разбросать различные записи по нескольким категориям, чтобы затем вывести их на экран. Так же, как и в предыдущем примере, мы будем использовать функцию add_action для инициирования нашей новой функции. Кроме того, функция register_taxonomy($taxonomy, $object_type, $args) очень похожа на функцию register_post_type по своим параметрам:
$taxonomy
Строка без прописных букв и пробелов
$object_type
Определяет тип записи, к которому будет прикреплена новая таксономия
$args
Дополнительный массив, который содержит опции и метки подобно тому, что мы видели в функции register_post_type:
//Add Book Categories add_action( 'init', 'sm_book_taxonomies', 0 ); function sm_book_taxonomies(){ register_taxonomy('sm_book_category', 'sm_books', array( 'hierarchical'=>true, 'label'=>'Categories' ) ); }
Добавление мета полей
Как вы, возможно, заметили, у каждой книги есть разнообразные атрибуты, включающие в себя цену, ссылки и т.д. Мы добавим эти атрибуты как произвольные поля метаданных, используя хук add_meta_boxes. Также мы добавим хук save_post для сохранения этих полей. Как только мы инициируем нашу функцию, функция add_meta_box( $id, $title, $callback, $post_type, $context, $priority, $callback_args ) установит “ID,” “Name” и “Description” для области поля. Параметр $post_type определяет, в каких типах записей должны появляться заданные поля. В качестве $callback мы будем использовать функцию sm_bk_info_box, которая будет обрабатывать HTML-представление полей формы.
add_action( 'add_meta_boxes', 'sm_book_extra_box' ); add_action( 'save_post', 'sm_books_save_postdata' ); function sm_book_extra_box() { add_meta_box( 'sm_bk_info_box', __( 'Book Information', 'sm_bk_info_box' ), 'sm_bk_info_box', 'sm_books', 'side' ); } /* Prints the box content */ function sm_bk_info_box( $post ) { $price = get_post_meta( $post->ID, 'price', true ); $sale_price = get_post_meta( $post->ID, 'sale_price', true ); $link_amazon = get_post_meta( $post->ID, 'link_amazon', true ); $link_google = get_post_meta( $post->ID, 'link_google', true ); $link_apple = get_post_meta( $post->ID, 'link_apple', true ); // Use nonce for verification wp_nonce_field( plugin_basename( __FILE__ ), 'sm_book_noncename' ); ?> <p> <label for="price">Price <input type="text" name="price" id="price" size="10" value="<?php echo $price; ?>" /> </label> </p> <p> <label for="sale_price">Sale Price <input type="text" name="sale_price" id="sale_price" size="10" value="<?php echo $sale_price; ?>" /> </label> </p> <p> <label for="link_amazon">Amazon Link <input type="text" name="link_amazon" id="link_amazon" size="25" value="<?php echo $link_amazon; ?>" /> </label> </p> <p> <label for="link_google">Google Link <input type="text" name="link_google" id="link_google" size="25" value="<?php echo $link_google; ?>" /> </label for="myplugin_new_field"> </p> <p> <label for="link_apple">Apple Link <input type="text" name="link_apple" id="link_apple" size="25" value="<?php echo $link_apple; ?>" /> </label> </p> <?php }
Для сохранения мета данных мы создадим функцию sm_books_save_postdata, которую мы определили в хуке save_post. В этой функции мы установим проверку для отправленных данных записи и обновим мета данные записи с помощью функции update_post_meta. Добавьте следующий сниппет к файлу sm_books.php, чтобы предоставить плагину обновляемый набор произвольных полей:
function sm_books_save_postdata($post_id){ if ( defined( 'DOING_AUTOSAVE' ) && DOING_AUTOSAVE ) return; if ( !wp_verify_nonce( $_POST['sm_book_noncename'], plugin_basename( __FILE__ ) ) ) return; if ( !current_user_can( 'edit_post', $post_id ) ) return; if( isset( $_POST['price'] ) ){ update_post_meta( $post_id,'price', esc_attr( $_POST['price'] ) ); } if( isset( $_POST['sale_price'] ) ){ update_post_meta( $post_id,'sale_price', esc_attr( $_POST['sale_price'] ) ); } if( isset( $_POST['link_amazon'] ) ){ update_post_meta( $post_id,'link_amazon', esc_attr( $_POST['link_amazon'] ) ); } if( isset( $_POST['link_google'] ) ){ update_post_meta( $post_id,'link_google', esc_attr( $_POST['link_google'] ) ); } if( isset( $_POST['link_apple'] ) ){ update_post_meta( $post_id,'link_apple', esc_attr( $_POST['link_apple'] ) ); } }
Функция update_post_meta получает в качестве первого параметра ID записи, в качестве второго параметра – ключ для обновления, а в качестве третьего параметра – значение поля.
Добавляем популярную запись (Featured Post)
Для нашей произвольной книжной системы нам понадобится добавить опцию для миниатюры, которая будет использоваться в качестве обложки книги на полке. Чтобы реализовать это, мы прибегнем к миниатюрам для популярных записей. Размер изображения, который мы будем использовать, мы установим в функции add_image_size.
//Enable Thumbnail if ( function_exists( 'add_theme_support' ) ) { add_theme_support( 'post-thumbnails' ); set_post_thumbnail_size( 150, 150 ); add_image_size( 'book-thumb', 84, 107, true ); }
Название миниатюры, на которую мы будем ссылаться, сохраним в book-thumb. Размер миниатюры будет составлять 84 × 107 пикселей. Числа можно менять в случае необходимости.
Добавляем шорткоды
Теперь, когда мы закончили с административной стороной плагина, пора переходить к его фронтэнду. В данном учебном руководстве мы будем использовать шорткоды WordPress для размещения списка книг на странице. Наш шорткод будет выглядеть следующим образом:
[sm_books category="coding"]
Шорткод, приведенный выше, будет использоваться для вывода на экран книг в рубрике “Coding”. Обратите внимание на то, что “Coding” – это слаг для произвольной таксономии, которую мы создали. Если мы уберем атрибут category в шорткоде, плагин просто выведет список всех книг.
Давайте теперь продолжим работу с шорткодами. Добавим в файл sm_books.php следующий код:
function sm_display($atts) { extract( shortcode_atts( array('category' => ''), $atts ) ); $args = array('post_type'=>'sm_books', 'sm_book_category'=>$category); $posts = new WP_Query( $args ); $html = '<div class="sm_holder"><div class="shelf"><div class="innerDiv" id="sm_book_1">'; // Book Loop if ( $posts->have_posts() ) : while ( $posts->have_posts() ) : $posts->the_post(); $book_cover = get_the_post_thumbnail( get_the_ID(),'book-thumb', $attr=array("alt"=>get_the_title()) ); $html .= '<a href="'.get_permalink().'" class="books">'.$book_cover.'</a>'; endwhile; endif; $html.='</div></div><table class="sm_book_tbl" cellspacing="0" cellpadding="0">'; // The Loop if ( $posts->have_posts() ) : while ( $posts->have_posts() ) : $posts->the_post(); $price = get_post_meta( get_the_ID(), 'price', true ); $sale_price = get_post_meta( get_the_ID(), 'sale_price', true ); $link_amazon = get_post_meta( get_the_ID(), 'link_amazon', true ); $link_google = get_post_meta( get_the_ID(), 'link_google', true ); $link_apple = get_post_meta( get_the_ID(), 'link_apple', true ); $html.='<tr><td class="title"><a href="'.get_permalink().'">'.get_the_title().'</a><br>'; if ($link_amazon): $html .= '<small><a style="color:#999" href="'.$link_amazon.'">Amazon</a>'; if ($link_google || link_apple): $html .=' | '; endif; endif; if($link_google): $html .='<a style="color:#999" href="'.$link_google.'">Google</a></small>'; if($link_apple): $html .=' | '; endif; endif; if($link_apple): $html .='<a style="color:#999" href="'.$link_apple.'">Apple</a></small>'; endif; $html .= '</td><td>'; if ($sale_price && $price) { $html .= $sale_price.'<br />'; $html .= '<span class="old_price">'.$price.'</span>'; } elseif ($price) { $html .= $price; } else { $html .= ''; } $html .= '</td> <td class="cart"> <a style="margin:0px" class="sm_cart_button" href="'.get_permalink().'">Add to Cart</a> </td> </tr>'; endwhile; endif; $html .= '</table>'; $html .= '</div>'; return $html; }
В данном сниппете мы создали несколько циклов, которые будут обрабатываться в случае ввода шорткода. С помощью класса WP_Query мы создаем несколько циклов, позволяющих вывести книги на экран. Аргументы, которые нам понадобятся – post_type из sm_books, а также аргумент, запрашивающий таксономию в функции sm_book_category. Необходимое значение мы получим из шорткода.
Первый цикл обертывает обложку книг в блок div, в котором будет отображаться изображение полки. Второй цикл размещает ряд строк ниже полки – здесь будет находиться некоторая информация о каждой книге. Теги шаблонов используются следующим образом:
get_permalink()
Выбирает постоянную ссылку.
get_the_ID()
Выбирает ID (идентификатор) записи, который объединен с get_post_meta для получения мета полей.
get_the_title()
Выбирает заголовок.
Завершающий аккорд для шорткода – хук, который регистрирует шорткод. Первый аргумент – это строка, которая будет вызывать шорткод. Второй аргумент – функция, которая будет выполняться. Добавим следующий код ниже функции:
add_shortcode( 'sm_books', 'sm_display' );
Стилизация списка книг
Внешний вид того, что мы сейчас имеем, может показаться не слишком презентабельным. На данном этапе мы добавим некоторый CSS-код, чтобы как-то разнообразить наш вывод. Создадим папку под названием sm_books. Затем в ней создадим файл style.css и добавим к нему следующий код:
.sm_holder { padding: 0px; border-bottom: 5px solid #41B7D8; width: 630px; } div.shelf { background-image: url(shelf_bg.jpg); display: block; } .shelf div.innerDiv { padding: 0px 34px; width: 100%; } .shelf .books img { margin-right: 10px; padding-top: 15px; margin-bottom: 11px; } span.old_price { color: #E53B2C; text-decoration: line-through; } .sm_book_tbl { margin: 0px 20px 0px 0px !important; width: 100%; background-color: #f3f3f3; border: 1px solid #e5e5e5 } .sm_book_tbl td.title { height: 60px; width: 70%; padding-left: 20px; padding-right: 20px; color: #999 } .sm_book_tbl td.cart { padding: 10px 20px; color: #999; }
В нашей таблице стилей мы добавим фоновое изображение к блоку div для книжной полки, что отмечено в объявлении класса div.shelf. Это изображение будет находиться в папке sm_books. Добавим изображение shelf_bg.jpg в эту папку.
После того, как изображение окажется в папке, мы прикрепим таблицу стилей к нашему плагину. Добавьте следующей сниппет в самый низ файла sm_books.php. С помощью функций WordPress мы проведем регистрацию таблицы стилей относительно текущей папки с системой WordPress.
function sm_add_styles() { wp_register_style( 'sm_add_styles', plugins_url('sm_books/style.css', __FILE__) ); wp_enqueue_style( 'sm_add_styles' ); } add_action( 'wp_enqueue_scripts', 'sm_add_styles' );
Плагин готов. Если вам лень самостоятельно создавать плагин, вы можете скачать готовое решение по ссылке: http://media.smashingmagazine.com/wp-content/uploads/2012/07/b4ucode-smashing-bookshelf.1.0.0.zip.
http://wp.smashingmagazine.com/2012/07/24/wordpress-bookshelf-plugin/