Вы можете заказать:
Верстку
Шаблон
Плагин

Пишем портфолио – плагин для WordPress

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

Итак, задумка так и останется задумкой если ее не начать реализовывать.

Этап 1.

Создаем папку my-portfolio в /wp-content/plugins/

Создаем структуру файлов:

  1. my-portfolio/inc/ – тут будут основные подключаемые файлы плагина
  2. my-portfolio/libs/ – тут файлы стилей, скрипты, и т.п
  3. my-portfolio/portfolio/ – здесь файлы шаблонов (категория, одиночная запись)

В папке плагина создаем основной файл my-portfolio.php и начинаем его понемногу заполнять


<?php
/*
* Plugin Name: My Portfolio
* Description: Плагин портфолио для своего сайта
* Plugin URI: https://....
* Author: Denkon
* Version: 1.0
*/
include_once('inc/functions.php');
include_once('inc/taxonomy-portfolio.php');

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

Создаем файл taxonomy-portfolio.php в папке inc для создания нового типа записи:


<?php

// file: taxonomy-portfolio.php

// Регистрируем новый тип записи

function register_new_type_portfolio() {

$labels = array(
'name' =&gt; __( 'Портфолио', 'text-domain' ),//Основное название типа записей
'singular_name' =&gt; __( 'Запись', 'text-domain' ),//Название для одной записи данного вида
'add_new' =&gt; _x( 'Добавить', 'text-domain', 'text-domain' ),//Текст для добавления новой записи
'add_new_item' =&gt; __( 'Добавить', 'text-domain' ),//Текст для добавления нового поста. Аналогична тексту "Добавить новый пост" у стандартных записей
'edit_item' =&gt; __( 'Редактировать', 'text-domain' ),//Текст для редактирования записи
'new_item' =&gt; __( 'Новая', 'text-domain' ),//Текст новой записи
'view_item' =&gt; __( 'Просмотреть', 'text-domain' ),//Текст для просмотра записи
'search_items' =&gt; __( 'Найти', 'text-domain' ),//Текст для кнопки поиска
'not_found' =&gt; __( 'Не найдено', 'text-domain' ),//Текст, если в результате поиска не была найдена ни одна запись
//'not_found_in_trash' =&gt; __( 'В корзине товаров нет', 'text-domain' ),//Текст, если в корзине нет записей
//'parent_item_colon' =&gt; __( 'Родительский товар:', 'text-domain' ),//Текст для родительских типов. Применяется для древовидных типов записей
'menu_name' =&gt; __( 'Портфолио', 'text-domain' ),//Текст пункта меню
);

$args = array(
'labels' =&gt; $labels,//Массив, описанный выше
'hierarchical' =&gt; false,//true - записи имеют древовидную структуру, false - записи имеют обычную структуру
'description' =&gt; '',//Описание типа записи
'taxonomies' =&gt; array('goods'),//Таксономии, с которыми нужно связать этот тип записей
'public' =&gt; true,//true - публичный тип записей, false - не публичный тип записей
'show_ui' =&gt; true,//Создавать ли логику управления данным типом записи в админ-панели
'show_in_menu' =&gt; true,//Показывать ли тип записи в меню админ-панели
'show_in_admin_bar' =&gt; true,//Делает тип записи доступным из меню
'menu_position' =&gt; null,//Позиция расположения пункта меню в админ-панели
'menu_icon' =&gt; null,//Иконка для пункта меню в админ-панели
'show_in_nav_menus' =&gt; true,//Включить данный тип записи в навигацию, чтобы записи можно было выбирать в меню
'publicly_queryable' =&gt; true,//true - запросы, относящиеся к этому типу записей будут работать на фронтенде сайта, false- нет
'exclude_from_search' =&gt; false,//Исключить данный тип записи из поиска
'has_archive' =&gt; true,//Нужна ли поддержка страниц архивов
'query_var' =&gt; true,//Включает/Выключает возможность запросов
'can_export' =&gt; true,//Можно ли экспортировать данный тип записей
'rewrite' =&gt; true,//true - использовать ЧПУ для этого типа записей, false - нет
'capability_type' =&gt; 'post',//Строка которая будет маркером для установки прав для этого типа записи. Встроенные маркеры это: post и page.
'supports' =&gt; array(//Поля необходимые при создании данного типа записей
'title',//блок заголовка
'editor',//блок ввода контента
'author',//возможность выбора автора поста
'thumbnail',//блок миниатюры поста
'excerpt',//поле ввода краткого описания поста (цитаты)
'custom-fields',//произвольные поля
'trackbacks',//блок уведомлений
'comments',//блок комментариев поста
'revisions',//ревизии поста
'page-attributes',//атрибуты постоянных страниц
'post-formats'//форматы записей, при условии, что они включены в теме
)
);

register_post_type( 'portfolio', $args );
}

add_action( 'init', 'register_new_type_portfolio' );

function add_new_cat_portfolio() {

$labels = array(
'name' =&gt; _x( 'Категории', 'Taxonomy plural name', 'text-domain' ),//Название таксономии во множественном числе
'singular_name' =&gt; _x( 'Категория', 'Taxonomy singular name', 'text-domain' ),//Название для единичного элемента таксономии
'search_items' =&gt; __( 'Найти', 'text-domain' ),//Текст для кнопки поиска элемента таксономии
'popular_items' =&gt; __( 'Популярные', 'text-domain' ),//Текст для популярных элементов таксономии
'all_items' =&gt; __( 'Все', 'text-domain' ),//Текст для всех элементов таксономии
'parent_item' =&gt; __( 'Родительский', 'text-domain' ),//Текст для родительского элемента таксономии
'parent_item_colon' =&gt; __( 'Родительский:', 'text-domain' ),//Тоже самой, что и parent_item только с двоеточием в конце
'edit_item' =&gt; __( 'Редактировать', 'text-domain' ),//Текст для редактирования элемента таксономии
'update_item' =&gt; __( 'Обновить', 'text-domain' ),//Текст для обновления элемента таксономии
'add_new_item' =&gt; __( 'Добавить', 'text-domain' ),//Текст для добавления нового элемента таксономии
'new_item_name' =&gt; __( 'Создать', 'text-domain' ),
'add_or_remove_items' =&gt; __( 'Добавить', 'text-domain' ),
'choose_from_most_used' =&gt; __( 'Редактировать', 'text-domain' ),
'menu_name' =&gt; __( 'Категории', 'text-domain' ),
);

$args = array(
'labels' =&gt; $labels,
'public' =&gt; true,
'show_in_nav_menus' =&gt; true,
'show_admin_column' =&gt; false,
'hierarchical' =&gt; true,
'show_tagcloud' =&gt; true,
'show_ui' =&gt; true,
'query_var' =&gt; true,
'rewrite' =&gt; true,
'capabilities' =&gt; array(),
);

register_taxonomy(
'project',//Уникальный идентификатор таксономии
array( 'portfolio' ),
$args
);
}

add_action( 'init', 'add_new_cat_portfolio' );

О создании своих типов записи более подробно вы можете прочитать на сайте wordpressrus.ru, когда то мне пригодился данный пост. После того как мы закончили с таксономией создадим там же в папке inc файл functions.php и подключим в нем наши файлы стилей и скрипты


<?php

// Подключаем фалы css, js
function portfolio_enqueue_style() {
wp_enqueue_style( 'myfolio', plugins_url( 'libs/css/my-portfolio.css', __FILE__ ), false );

wp_enqueue_script('jquery');

wp_enqueue_script('myfolio-script', plugins_url( 'libs/js/my-portfolio.js', __FILE__ ), false );

}
add_action( 'wp_enqueue_scripts', 'portfolio_enqueue_style' );

Этап 3.
В папке /portfolio/ создаем 2 файла – category-portfolio.php и single-portfolio.php

Файл: category-portfolio.php

<?php // category-portfolio.php get_header(); ?>


<section id="primary" class="content-area">

<main class="folio-content site-main" role="main">

<?php if ( have_posts() ) : ?>

<div class="page-header">
<?php
//the_archive_title( '
<h1 class="page-title">', '</h1>

' );
single_cat_title('
<h1 class="page-title">', '</h1>

');
the_archive_description( '
<div class="taxonomy-description">', '</div>

' );
?>
</div>

<!-- .page-header -->
<?php endif; ?>

<?php while ( have_posts() ) : the_post(); ?>


<article id="post-<?php the_ID(); ?>" <?php post_class(); ?>>

<div class="entry-header">
<h3 class="entry-title"><?php the_title();?></h3>
</div>


<div class="entry-content">
<?php the_excerpt();?>
</div>

</article>


<?php endwhile; ?>



</main><!-- .folio-content -->

</section>


<?php get_sidebar(); ?>

<?php get_footer(); ?>

Файл: single-portfolio.php

<?php //single-portfolio.php get_header(); ?>


<section id="primary" class="content-area">

<main class="folio-content site-main" role="main">

<?php if ( have_posts() ) : ?>

<div class="page-header">


<h1><?php the_title(); ?></h1>


</div>

<!-- .page-header -->
<?php endif; ?>

<?php while ( have_posts() ) : the_post(); ?>


<article id="post-<?php the_ID(); ?>" <?php post_class(); ?>>

<div class="entry-content">
<?php the_content();?>
</div>

</article>


<?php endwhile; ?>



</main><!-- .folio-content -->

</section>


<?php get_sidebar(); ?>

<?php get_footer(); ?>

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

Теперь переходим в файл my-portfolio.php и добавляем этот код:


// Вывод файлов плагина

if ( ! defined( 'RC_TC_BASE_FILE' ) )
define( 'RC_TC_BASE_FILE', __FILE__ );
if ( ! defined( 'RC_TC_BASE_DIR' ) )
define( 'RC_TC_BASE_DIR', dirname( RC_TC_BASE_FILE ) );
if ( ! defined( 'RC_TC_PLUGIN_URL' ) )
define( 'RC_TC_PLUGIN_URL', plugin_dir_url( __FILE__ ) );

add_filter( 'template_include', 'template_my_portfolio');

function template_my_portfolio( $template ) {

// Post ID
$post_id = get_the_ID();

if ( get_post_type( $post_id ) != 'portfolio' ) {
return $template;
}

// Else use custom template
if ( is_single() ) {
return template_portfolio( 'single-portfolio' );
}
if ( is_archive() ) {
return template_portfolio( 'category-portfolio' );
}

}

function template_portfolio( $template ) {

$template_slug = rtrim( $template, '.php' );
$template = $template_slug . '.php';

// Проверяем если в установленном шаблоне папка portfolio с файлами
if ( $theme_file = locate_template( array( '/my-portfolio/portfolio/' . $template ) ) ) {
$file = $theme_file;
}
else {
$file = RC_TC_BASE_DIR . '/portfolio/' . $template;
}

return apply_filters( 'rc_repl_template_' . $template, $file );
}

Кто в php разбирается тому не нужны пояснения данного кода, остальным поясню что код который вы добавили проверит есть ли в установленной темы папка my-portfolio/portfolio и в ней наши файлы и если есть то wordpress подключит уже файлы из темы  где вы сможете редактировать их по своему усмотрению, вот и все основной каркас создан и каждый уже может по своему его развивать, добавлять (к примеру произвольные поля для этого типа записи и т.п.)

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

Света

Я не думала что найду, спасибо большое!