- Download last WP
- Install WP
- Create base structure
- Put css in to style.css
- WordPress Template Hierarchy
- The Loopwp_query
- Create page structure
- Set static home page
- Set blog page
- Create Menu
- Widgets(sidebar, footer)
- For child theme add in style.css Template: ‘parent theme name’, and link main theme stylesheet using @import.
- Index files
- Static front page – front-page.php
- Your latest post home.php (if front-page.php doesn’t exist)
- Pages
- page$id.php or page$slug.php
- page.php
- Post
- single-post.php
- single$postType
- single.php
- Custom Template (/* Template Name: name*/)
- Blog – home.php
- Comments.php
- Archive
- date.php
- category$ID and category$slug
- category.php
- archive-$posttype.php
- body class has page name class body_class();
- plugin – Custom Post Type UI
- MIME type templates
- $mimetype.php (image.php)
- $subtyte.php ( imagepng.php)
- attachment.php
- Search
- search.php – page with result (else no result + searchform)
- searchform.php – search form file (get_search_form())
- 404
- 404.php
- sidebar
-
<?php get_sidebar(); ?> <?php if( !dynamic_sidebar( 'page' ) :)?> // если нет виджетов в сайдбаре, и это не для страницы sidebar-page.php, то вывести этот код <?php endif;?>
sidebar.php / sidebar-name.php
- wp_config.php – define(‘WP_DEBUG’, true);
-
Get template part
// create file content-name.php <?php get_template_part('content', 'name') ?>
main scripts
//return network home url <?php echo network_home_url(); ?> //return template directory url <?php get_template_directory_uri(); ?> //post metaboxes <?php echo get_post_meta( $post->ID, 'meta_name', true ) ?> //the title link to post <a href="<?php the_permalink(); ?>" title="<?php the_title_attribute(); ?>"><h1><?php the_title(); ?></h1></a>
style.css
/* Theme Name: Author: Author URI: Version: */
main.js
// no conflict for jQuery jQuery( document ).ready(function( $ ) { // You can use the locally-scoped $ in here as an alias to jQuery. $( "div" ).hide(); });
header.php
<html <?php language_attributes(); ?>> <meta charset="<?php bloginfo( 'charset' ); ?>"> <meta name="description" content="<?php bloginfo( 'description' ); ?>"> <title><?php bloginfo('name'); ?></title> <?php wp_head(); ?> <body <?php body_class(); ?>> <?php get_template_part( 'navigation' ); ?>
navigation.php
<!-- insert navigation menu from WP / registration in function.php --> <?php $defaults = array( 'menu_class' => 'menu class' ); wp_nav_menu( $defaults ); ?>
index.php
<? get_header(); ?> <!--include header.php--> <? get_footer(); ?> <!--include footer.php-->
sidebar.php
<? get_sidebar(); ?> <!--include sidebar.php--> <? get_sidebar( 'name' ); ?> <!--include sidebar-name.php-->
footer.php
<!-- put Yandex and Google metrika scripts here or in function.php> <?php wp_footer(); ?>
function.php
<?php //link styles // wp_enqueue_style( 'name', PATH ) function theme_styles() { wp_enqueue_style( 'main', get_template_directory_uri() . '/css/main.css' ); } add_action( 'wp_enqueue_scripts', 'theme_styles' ); //link scripts // wp_enqueue_script ( 'name', PATH, 'array('scripts position')', '$ver', "place in footer = true, false" ) function theme_js() { wp_enqueue_script( 'main', get_template_directory_uri() . '/js/main.js' ); } add_action( 'wp_enqueue_scripts', 'theme_js' ); //add theme support add_theme_support( 'post-thumbnails' ); // Navigation Menus function register_theme_menus() { register_nav_menus( array( 'header-menu' => __( 'Header Menu' ) ) ); } add_action( 'init', 'register_theme_menus' ); /** * Link all post thumbnails to the post permalink. * * @param string $html Post thumbnail HTML. * @param int $post_id Post ID. * @param int $post_image_id Post image ID. * @return string Filtered post image HTML. */ function wpdocs_post_image_html( $html, $post_id, $post_image_id ) { $html = '<a href="' . get_permalink( $post_id ) . '" alt="' . esc_attr( get_the_title( $post_id ) ) . '">' . $html . '</a>'; return $html; } add_filter( 'post_thumbnail_html', 'wpdocs_post_image_html', 10, 3 );
Conditional statements
$num_posts = ( is_front_page() ) ? 4 : -1; $args = array ( 'post_type' => 'portfolio', 'post_per_page' => $num_posts );
//Add custom page post_type if ( ! function_exists( 'structure_page_cp' ) ) { // Опишем требуемый функционал function structure_page_cp() { $labels = array( 'name' => _x( 'Структура', 'Post Type General Name', 'structure_page' ), 'singular_name' => _x( 'Структура', 'Post Type Singular Name', 'structure_page' ), 'menu_name' => __( 'Структура', 'structure_page' ), 'parent_item_colon' => __( 'Родительский:', 'structure_page' ), 'all_items' => __( 'Все записи', 'structure_page' ), 'view_item' => __( 'Просмотреть', 'structure_page' ), 'add_new_item' => __( 'Добавить новую запись в Красную Книгу', 'structure_page' ), 'add_new' => __( 'Добавить новую', 'structure_page' ), 'edit_item' => __( 'Редактировать запись', 'structure_page' ), 'update_item' => __( 'Обновить запись', 'structure_page' ), 'search_items' => __( 'Найти запись', 'structure_page' ), 'featured_image' => __( 'Изображение', 'structure_page' ), 'not_found' => __( 'Не найдено', 'structure_page' ), 'not_found_in_trash' => __( 'Не найдено в корзине', 'structure_page' ), ); $args = array( 'labels' => $labels, 'supports' => array( 'title', 'editor', 'excerpt', ), 'taxonomies' => array( 'structure_page_tax' ), // категории, которые мы создадим ниже 'public' => true, 'menu_position' => 5, 'menu_icon' => 'dashicons-book', ); register_post_type( 'structure_page', $args ); } add_action( 'init', 'structure_page_cp', 0 ); // инициализируем //добавить категории для post_type if ( ! function_exists( 'structure_page_tax' ) ) { // Опишем требуемый функционал function structure_page_tax() { $labels = array( 'name' => _x( 'Категории Структура', 'Taxonomy General Name', 'structure_page' ), 'singular_name' => _x( 'Категории Структура', 'Taxonomy Singular Name', 'structure_page' ), 'menu_name' => __( 'Категории Структура', 'structure_page' ), 'all_items' => __( 'Категории Структура', 'structure_page' ), 'parent_item' => __( 'Родительская категория Структура', 'structure_page' ), 'parent_item_colon' => __( 'Родительская категория Структура:', 'structure_page' ), 'new_item_name' => __( 'Новая категория', 'structure_page' ), 'add_new_item' => __( 'Добавить новую категорию', 'structure_page' ), 'edit_item' => __( 'Редактировать категорию', 'structure_page' ), 'update_item' => __( 'Обновить категорию', 'structure_page' ), 'search_items' => __( 'Найти', 'structure_page' ), 'add_or_remove_items' => __( 'Добавить или удалить категорию', 'structure_page' ), 'choose_from_most_used' => __( 'Поиск среди популярных', 'structure_page' ), 'not_found' => __( 'Не найдено', 'structure_page' ), ); $args = array( 'labels' => $labels, 'hierarchical' => true, 'public' => true, ); register_taxonomy( 'structure_page_tax', array( 'structure_page' ), $args ); } add_action( 'init', 'structure_page_tax', 0 ); // инициализируем } }
Add custom meta boxes
//добавить новые поля для post_type - структура function my_meta_box() { add_meta_box( 'my_meta_box', // Идентификатор(id) 'Дополнительные поля', // Заголовок области с мета-полями(title) 'show_my_metabox', // Вызов(callback) 'structure_page', // Где будет отображаться наше поле, в нашем случае в Записях 'normal', 'high'); } add_action('add_meta_boxes', 'my_meta_box'); // Запускаем функцию $meta_fields = array( array( 'label' => 'Заголовок 1', 'desc' => ' ', 'id' => 'header1', // даем идентификатор. 'type' => 'text' // Указываем тип поля. ), array( 'label' => 'Текстовое поле 1', 'desc' => 'Описание для поля.', 'id' => 'text_area1', // даем идентификатор. 'type' => 'textarea' // Указываем тип поля. ), array( 'label' => 'Чекбоксы (флажки)', 'desc' => 'Описание для поля.', 'id' => 'mycheckbox', // даем идентификатор. 'type' => 'checkbox' // Указываем тип поля. ), array( 'label' => 'Всплывающий список', 'desc' => 'Описание для поля.', 'id' => 'myselect', 'type' => 'select', 'options' => array ( // Параметры, всплывающие данные 'one' => array ( 'label' => 'Вариант 1', // Название поля 'value' => '1' // Значение ), 'two' => array ( 'label' => 'Вариант 2', // Название поля 'value' => '2' // Значение ), 'three' => array ( 'label' => 'Вариант 3', // Название поля 'value' => '3' // Значение ) ) ) ); // Вызов метаполей function show_my_metabox() { global $meta_fields; // Обозначим наш массив с полями глобальным global $post; // Глобальный $post для получения id создаваемого/редактируемого поста // Выводим скрытый input, для верификации. Безопасность прежде всего! echo '<input type="hidden" name="custom_meta_box_nonce" value="'.wp_create_nonce(basename(__FILE__)).'" />'; // Начинаем выводить таблицу с полями через цикл echo '<table class="form-table">'; foreach ($meta_fields as $field) { // Получаем значение если оно есть для этого поля $meta = get_post_meta($post->ID, $field['id'], true); // Начинаем выводить таблицу echo '<tr> <th><label for="'.$field['id'].'">'.$field['label'].'</label></th> <td>'; switch($field['type']) { case 'text': echo '<input type="text" name="'.$field['id'].'" id="'.$field['id'].'" value="'.$meta.'" size="30" /> <br /><span class="description">'.$field['desc'].'</span>'; break; case 'textarea': echo '<textarea name="'.$field['id'].'" id="'.$field['id'].'" cols="60" rows="4">'.$meta.'</textarea> <br /><span class="description">'.$field['desc'].'</span>'; break; case 'checkbox': echo '<input type="checkbox" name="'.$field['id'].'" id="'.$field['id'].'" ',$meta ? ' checked="checked"' : '','/> <label for="'.$field['id'].'">'.$field['desc'].'</label>'; break; // Всплывающий список case 'select': echo '<select name="'.$field['id'].'" id="'.$field['id'].'">'; foreach ($field['options'] as $option) { echo '<option', $meta == $option['value'] ? ' selected="selected"' : '', ' value="'.$option['value'].'">'.$option['label'].'</option>'; } echo '</select><br /><span class="description">'.$field['desc'].'</span>'; break; } echo '</td></tr>'; } echo '</table>'; } // Пишем функцию для сохранения function save_my_meta_fields($post_id) { global $meta_fields; // Массив с нашими полями // проверяем наш проверочный код if (!wp_verify_nonce($_POST['custom_meta_box_nonce'], basename(__FILE__))) return $post_id; // Проверяем авто-сохранение if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE) return $post_id; // Проверяем права доступа if ('page' == $_POST['post_type']) { if (!current_user_can('edit_page', $post_id)) return $post_id; } elseif (!current_user_can('edit_post', $post_id)) { return $post_id; } // Если все отлично, прогоняем массив через foreach foreach ($meta_fields as $field) { $old = get_post_meta($post_id, $field['id'], true); // Получаем старые данные (если они есть), для сверки $new = $_POST[$field['id']]; if ($new && $new != $old) { // Если данные новые update_post_meta($post_id, $field['id'], $new); // Обновляем данные } elseif ('' == $new && $old) { delete_post_meta($post_id, $field['id'], $old); // Если данных нету, удаляем мету. } } // end foreach } add_action('save_post', 'save_my_meta_fields'); // Запускаем функцию сохранения
Codex Reference
- Theme Development Checklist
- Theme Development
- Theme Unit Test
- Theme Review for Submitting to WordPress.org