SlideShare a Scribd company logo
Как получить чёрный пояс
по WordPress?
v. 2.0
Евгений Котельницкий
Kharkiv WordPress, 2016
Евгений Котельницкий
+YevhenKotelnytskyi
@yeeevhen
http://4coder.info/me
Как получить чёрный пояс по WordPress? v2.0
План
1. С чего мы начинали?
2. Что определяет уровень разработчика?
3. Через что проходит WP разработчик?
4. Что дальше?
Как получить чёрный пояс по WordPress? v2.0
Делаем первые шаги
Шаг 1 - Регестрируем блог на WP.com
Шаг 2 - Поднимаем WP на Shared-хостинге
Шаг 3 - Устанавливаем темы
Шаг 4 - Вносим правки в тему
Шаг 5 - Устанавливаем плагины
Шаг 6 - Изучаем админку
WordPress User Roles
User Roles
● Super Admin – site network administration;
● Administrator – administration features within a single site;
● Editor – can publish and manage posts of other users;
● Author – can publish and manage their own posts;
● Contributor – can write posts but cannot publish them;
● Subscriber – can only manage their profile.
Первый пояс есть!
FTP / SFTP
PhpMyAdmin
Начинаем создавать темы осмысленно
Знакомимся с теорией:
● http://codex.wordpress.org/Theme_Development
● http://codex.wordpress.org/Template_Hierarchy
● http://codex.wordpress.org/Conditional_Tags
● ...
Plugins & MU plugins
Post Types
Стандартные и пользовательские типы контента
● Post (post type: 'post')
● Page (post type: 'page')
● Attachment (post type: 'attachment')
● Revision (post type: 'revision')
● Navigation menu (post type: 'nav_menu_item')
● Custom Post Type (CPT): register_post_type()
Taxonomies
Стандартная и пользовательская систематика
● Category (taxonomy: 'category')
● Tag (taxonomy: 'post_tag')
● Link Category (taxonomy: 'link_category')
● Post Formats (taxonomy: 'post_format')
● Custom Taxonomies: register_taxonomy()
Data Access API
Получаем доступ к данным
● WP_Query
● WP_Tax_Query
● WP_User_Query
● get_posts ()
● get_terms ()
● get_option ()
● get_post_meta ()
● get_user_meta ()
● ...
Второй пояс получен!
Database Structure
Получаем прямой доступ к данным
Direct Database Access abstraction
<?php
global $wpdb;
$wpdb->query(
$wpdb->prepare(
"DELETE FROM $wpdb->postmeta
WHERE post_id = %d
AND meta_key = %s",
13, 'gargle' ) );
?>
/**
* WordPress Database Access Abstraction
*/
class wpdb {
public function prepare( $query, $args );
public function show_errors( $show = true );
public function query( $query );
public function get_results( $query = null, $output = OBJECT ) {
public function get_row( $query = null, $output = OBJECT, $y = 0 );
public function get_col( $query = null , $x = 0 );
public function get_var( $query = null, $x = 0, $y = 0 );
public function update( $table, $data, $where, $format = null, $where_format = null );
...
Direct Database Access abstraction
Система хуков
<?php
do_action( $tag, $arg_a, $arg_b, $etc );
add_action( $tag, $function_to_add, $priority = 10, $accepted_args = 1 );
?>
<?php
apply_filters( $tag, $value );
add_filter( $tag, $function_to_add, $priority, $accepted_args );
?>
Actions
Filters
Достигнут новый пояс!
Source Code Management Systems
Стандарты кодирования
PHP Coding Standards
HTML Coding Standards
CSS Coding Standards
JavaScript Standards
Localization
Localization
<?php
load_textdomain( $domain, $mofile );
load_plugin_textdomain( $domain, $abs_rel_path, $plugin_rel_path );
?>
<?php
$translated = __( 'Hello World!', 'domain' );
?>
<?php _e( 'Hello World!', 'domain' ) ?>
Localization & JS
<?php
// Register the script first
wp_register_script( 'some_handle', 'path/to/myscript.js' );
// Now we can localize the script with our data
$translation = array(
'some_str' => __( 'Some string', 'domain' ),
'a_value' => '10'
);
wp_localize_script( 'handle', 'object_name', $translation );
// The script can be enqueued now or later
wp_enqueue_script( 'handle' );
Зелёный пояс!
WP Network
WP Network
<?php
switch_to_blog( $blog_id );
// Do something
restore_current_blog();
?>
Network Database
● wp_blogs
● wp_blog_versions
● wp_registration_log
● wp_signups
● wp_site
● wp_sitemeta
Быстродействие
Синий пояс!
WordPress User Roles
Super Admin capabilities
● manage_network
● manage_sites
● manage_network_users
● manage_network_plugins
● manage_network_themes
● manage_network_options
● ...
Subscriber capabilities
● read
WordPress User Roles
class WP_Roles {
/**
* Add role name with capabilities to list.
*/
public function add_role( $role, $display_name, $capabilities = array() );
public function remove_role( $role );
/**
* Add capability to role.
*/
public function add_cap( $role, $cap, $grant = true );
public function remove_cap( $role, $cap );
...
WordPress User class
class WP_User {
/**
* Add role to user.
*/
public function add_role( $role );
public function remove_role( $role );
public function set_role( $role );
/**
* Add capability and grant or deny access to capability.
*/
public function add_cap( $cap, $grant = true );
public function remove_cap( $cap );
...
class WP_User {
/**
* Whether user has capability or role name.
* @return bool True, if user has capability;
* false, if user does not have capability.
*/
public function has_cap( $cap ) {
$caps = call_user_func_array( 'map_meta_cap', $args );
...
// Must have ALL requested caps
$capabilities = apply_filters(
'user_has_cap', $this->allcaps,
$caps, $args, $this );
...
WordPress User class
Впервые задумываемся о безопасности
Коричневый пояс!
Как работает WordPress?
WordPress environment setup class
class WP {
/**
* Sets up all of the variables required by the WordPress environment.
* @param string|array $query_args Passed to {@link parse_request()}
*/
public function main($query_args = '') {
$this->init();
$this->parse_request($query_args);
$this->send_headers();
$this->query_posts();
$this->handle_404();
$this->register_globals();
do_action_ref_array( 'wp', array( &$this ) );
}
...
WP_Rewrite - “Роутинг”
WP_Rewrite - “Роутинг”
class WP_Rewrite {
/**
* Retrieve the rewrite rules.
* @return array Rewrite rules.
*/
public function wp_rewrite_rules() {
$this->rules = get_option('rewrite_rules');
if ( empty($this->rules) ) {
$this->matches = 'matches';
$this->rewrite_rules();
update_option('rewrite_rules', $this->rules);
}
return $this->rules;
}
...
WP_Rewrite - “Роутинг”
Rewrite Rules
<?php
$rewrite = $wp_rewrite->wp_rewrite_rules();
array(
[robots.txt$] => index.php?robots=1
[category/(.+?)/?$] => index.php?category_name=$matches[1]
[page/?([0-9]{1,})/?$] => index.php?&paged=$matches[1]
[search/(.+)/?$] => index.php?s=$matches[1]
[([0-9]{4})/?$] => index.php?year=$matches[1]
[.?.+?/attachment/([^/]+)/?$] => index.php?attachment=$matches[1]
[(.?.+?)(/[0-9]+)?/?$] => index.php?pagename=$matches[1]&page=$matches[2]
...
WP_Rewrite - “Роутинг”
Rewrite Rules filters
1. apply_filters( 'post_rewrite_rules', $post_rewrite );
2. apply_filters( 'date_rewrite_rules', $date_rewrite );
3. apply_filters( 'root_rewrite_rules', $root_rewrite );
4. apply_filters( 'comments_rewrite_rules', $comments_rewrite );
5. apply_filters( 'search_rewrite_rules', $search_rewrite );
6. apply_filters( 'author_rewrite_rules', $author_rewrite );
7. apply_filters( 'page_rewrite_rules', $page_rewrite );
8. apply_filters( $permastructname . '_rewrite_rules', $rules );
9. apply_filters( 'rewrite_rules_array', $this->rules );
WP_Rewrite - “Роутинг”
WP_Rewrite::add_rule ()
// http://example.com/properties/123/
add_action( 'init', '_rewrites_init' );
function _rewrites_init() {
add_rewrite_rule(
'properties/([0-9]+)/?$',
'index.php?pagename=properties&property_id=$matches[1]', 'top' );
}
add_filter( 'query_vars', '_query_vars' );
function _query_vars( $query_vars ) {
$query_vars[] = 'property_id';
return $query_vars;
}
WP_Rewrite - “Роутинг”
WP_Rewrite::add_permastruct ()
<?php
class WP_Rewrite {
/**
* Add a new permalink structure.
*/
public function add_permastruct( $name, $struct, $args = array() ) {
...
$this->extra_permastructs[ $name ] = $args;
}
...
?>
WP_Rewrite - “Роутинг”
WP_Rewrite::add_permastruct ()
<?php
// http://example.com/au/some-prize-category/some-competition/
$wp_rewrite->add_rewrite_tag('%competition%', '([^/]+)', 'competition=');
$wp_rewrite->add_rewrite_tag('%prize_category%', '([^/]+)', 'prize_category=');
$wp_rewrite->add_permastruct(
'competition',
'/au/%prize_category%/%competition%/',
array( 'walk_dirs' => false ));
?>
WP_Query - The Query class
WordPress environment setup class
class WP {
/**
* Sets up all of the variables required by the WordPress environment.
* @param string|array $query_args Passed to {@link parse_request()}
*/
public function main($query_args = '') {
$this->init();
$this->parse_request($query_args);
$this->send_headers();
$this->query_posts();
$this->handle_404();
$this->register_globals();
do_action_ref_array( 'wp', array( &$this ) );
}
...
WP_Query - The Query class
The Main Query
/**
* WordPress environment setup class.
*/
class WP {
/**
* Set up the Loop based on the query variables.
*/
public function query_posts() {
global $wp_the_query;
$this->build_query_string();
$wp_the_query->query($this->query_vars);
}
...
WP_Query - The Query class
class WP_Query {
/**
* Sets up the WordPress query by parsing query string.
* @return array List of posts.
*/
public function query( $query ) {
$this->init();
$this->query = $this->query_vars = wp_parse_args( $query );
return $this->get_posts();
}
/**
* Retrieve the posts based on query variables.
* @return array List of posts.
*/
public function get_posts() {
...
do_action_ref_array( 'pre_get_posts', array( &$this ) );
...
WP_Query - The Query class
Query vars
/**
* Retrieve variable in the WP_Query class.
*
* @see WP_Query::get()
* @uses $wp_query
*
* @return mixed
*/
function get_query_var( $var, $default = '' ) {
global $wp_query;
return $wp_query->get( $var, $default );
}
Чёрный пояс!
Это всё?
Это начало :)
Highload & Perfomance,
Architecture, Supportability, Usability,
UNIX/Linux CLI, Stability, Unit
Testing, Continius integration,
… Communication skills,
Time management
Вопросы?
Спасибо!

More Related Content

PDF
Doctrine For Beginners
PDF
Design how your objects talk through mocking
PDF
Doctrine fixtures
PDF
Advanced symfony Techniques
PDF
Intro programacion funcional
PDF
WCLV13 JavaScript
PDF
Hooks WCSD12
PDF
A New Baseline for Front-End Devs
Doctrine For Beginners
Design how your objects talk through mocking
Doctrine fixtures
Advanced symfony Techniques
Intro programacion funcional
WCLV13 JavaScript
Hooks WCSD12
A New Baseline for Front-End Devs

What's hot (20)

ODP
Symfony2, creare bundle e valore per il cliente
ODP
Rich domain model with symfony 2.5 and doctrine 2.5
PPTX
10 Things Every Plugin Developer Should Know (WordCamp Atlanta 2013)
PDF
Silex meets SOAP & REST
PDF
You Don't Know Query (WordCamp Netherlands 2012)
PDF
The Zen of Lithium
PDF
PHPUnit でよりよくテストを書くために
PDF
Doctrine MongoDB ODM (PDXPHP)
PDF
PHP 5.3 and Lithium: the most rad php framework
PDF
Be RESTful (Symfony Camp 2008)
KEY
Api Design
PDF
The Origin of Lithium
PDF
Design Patterns avec PHP 5.3, Symfony et Pimple
PDF
CQRS and Event Sourcing in a Symfony application
PDF
Decoupling the Ulabox.com monolith. From CRUD to DDD
PPTX
WordPress plugin #3
PDF
Advanced Querying with CakePHP 3
PDF
Using Objects to Organize your jQuery Code
PDF
Unit and Functional Testing with Symfony2
PDF
The History of PHPersistence
Symfony2, creare bundle e valore per il cliente
Rich domain model with symfony 2.5 and doctrine 2.5
10 Things Every Plugin Developer Should Know (WordCamp Atlanta 2013)
Silex meets SOAP & REST
You Don't Know Query (WordCamp Netherlands 2012)
The Zen of Lithium
PHPUnit でよりよくテストを書くために
Doctrine MongoDB ODM (PDXPHP)
PHP 5.3 and Lithium: the most rad php framework
Be RESTful (Symfony Camp 2008)
Api Design
The Origin of Lithium
Design Patterns avec PHP 5.3, Symfony et Pimple
CQRS and Event Sourcing in a Symfony application
Decoupling the Ulabox.com monolith. From CRUD to DDD
WordPress plugin #3
Advanced Querying with CakePHP 3
Using Objects to Organize your jQuery Code
Unit and Functional Testing with Symfony2
The History of PHPersistence
Ad

Viewers also liked (10)

PDF
Как получить чёрный пояс по WordPress?
PDF
WordCamp Moscow 2016: Как получить качество
PDF
Как устроен WordPress - WP Kharkiv Meetup #1
PDF
Вёрстка WordPress тем - WP Kharkiv Meetup #1
PDF
Архитектура крупных WordPress сайтов
PDF
Как не сойти с ума при разработке крупных проектов на WordPress
PDF
Защищаем WordPress-сайт от хакерских атак
PDF
Premium-темы WordPress
PDF
SEO - поведенческие факторы.
PDF
Вёрстка по методологии БЭМ
Как получить чёрный пояс по WordPress?
WordCamp Moscow 2016: Как получить качество
Как устроен WordPress - WP Kharkiv Meetup #1
Вёрстка WordPress тем - WP Kharkiv Meetup #1
Архитектура крупных WordPress сайтов
Как не сойти с ума при разработке крупных проектов на WordPress
Защищаем WordPress-сайт от хакерских атак
Premium-темы WordPress
SEO - поведенческие факторы.
Вёрстка по методологии БЭМ
Ad

Similar to Как получить чёрный пояс по WordPress? v2.0 (20)

PDF
Why is crud a bad idea - focus on real scenarios
PPTX
Coming to Terms with OOP In Drupal - php[world] 2016
PPTX
You don’t know query - WordCamp UK Edinburgh 2012
PPTX
WordPress Plugin development
PPT
Easy rest service using PHP reflection api
PPT
Hardcore URL Routing for WordPress - WordCamp Atlanta 2014 (PPT)
PDF
WordPress REST API hacking
PDF
WordPress Queries - the right way
PDF
Best Practices in Plugin Development (WordCamp Seattle)
PDF
Becoming a better WordPress Developer
PDF
Laying the proper foundation for plugin and theme development
PDF
WordPress London 16 May 2012 - You don’t know query
PDF
WordPress REST API hacking
PDF
Unittests für Dummies
PDF
Virtual Madness @ Etsy
PDF
PHP 5.3 Overview
PDF
4Developers 2015: Be pragmatic, be SOLID - Krzysztof Menżyk
PDF
Be pragmatic, be SOLID
PDF
Image manipulation in WordPress 3.5
PDF
Extending the WordPress REST API - Josh Pollock
Why is crud a bad idea - focus on real scenarios
Coming to Terms with OOP In Drupal - php[world] 2016
You don’t know query - WordCamp UK Edinburgh 2012
WordPress Plugin development
Easy rest service using PHP reflection api
Hardcore URL Routing for WordPress - WordCamp Atlanta 2014 (PPT)
WordPress REST API hacking
WordPress Queries - the right way
Best Practices in Plugin Development (WordCamp Seattle)
Becoming a better WordPress Developer
Laying the proper foundation for plugin and theme development
WordPress London 16 May 2012 - You don’t know query
WordPress REST API hacking
Unittests für Dummies
Virtual Madness @ Etsy
PHP 5.3 Overview
4Developers 2015: Be pragmatic, be SOLID - Krzysztof Menżyk
Be pragmatic, be SOLID
Image manipulation in WordPress 3.5
Extending the WordPress REST API - Josh Pollock

Recently uploaded (20)

PDF
SAP S4 Hana Brochure 3 (PTS SYSTEMS AND SOLUTIONS)
PDF
Claude Code: Everyone is a 10x Developer - A Comprehensive AI-Powered CLI Tool
PPTX
Agentic AI Use Case- Contract Lifecycle Management (CLM).pptx
PDF
System and Network Administration Chapter 2
PDF
2025 Textile ERP Trends: SAP, Odoo & Oracle
PDF
top salesforce developer skills in 2025.pdf
PPTX
history of c programming in notes for students .pptx
PPTX
CHAPTER 12 - CYBER SECURITY AND FUTURE SKILLS (1) (1).pptx
PPTX
ManageIQ - Sprint 268 Review - Slide Deck
PPTX
Agentic AI : A Practical Guide. Undersating, Implementing and Scaling Autono...
PPTX
Operating system designcfffgfgggggggvggggggggg
PDF
Design an Analysis of Algorithms II-SECS-1021-03
PDF
Raksha Bandhan Grocery Pricing Trends in India 2025.pdf
PPTX
L1 - Introduction to python Backend.pptx
PDF
How to Choose the Right IT Partner for Your Business in Malaysia
PDF
Digital Strategies for Manufacturing Companies
PDF
medical staffing services at VALiNTRY
PDF
Audit Checklist Design Aligning with ISO, IATF, and Industry Standards — Omne...
PPT
Introduction Database Management System for Course Database
PDF
Odoo Companies in India – Driving Business Transformation.pdf
SAP S4 Hana Brochure 3 (PTS SYSTEMS AND SOLUTIONS)
Claude Code: Everyone is a 10x Developer - A Comprehensive AI-Powered CLI Tool
Agentic AI Use Case- Contract Lifecycle Management (CLM).pptx
System and Network Administration Chapter 2
2025 Textile ERP Trends: SAP, Odoo & Oracle
top salesforce developer skills in 2025.pdf
history of c programming in notes for students .pptx
CHAPTER 12 - CYBER SECURITY AND FUTURE SKILLS (1) (1).pptx
ManageIQ - Sprint 268 Review - Slide Deck
Agentic AI : A Practical Guide. Undersating, Implementing and Scaling Autono...
Operating system designcfffgfgggggggvggggggggg
Design an Analysis of Algorithms II-SECS-1021-03
Raksha Bandhan Grocery Pricing Trends in India 2025.pdf
L1 - Introduction to python Backend.pptx
How to Choose the Right IT Partner for Your Business in Malaysia
Digital Strategies for Manufacturing Companies
medical staffing services at VALiNTRY
Audit Checklist Design Aligning with ISO, IATF, and Industry Standards — Omne...
Introduction Database Management System for Course Database
Odoo Companies in India – Driving Business Transformation.pdf

Как получить чёрный пояс по WordPress? v2.0

  • 1. Как получить чёрный пояс по WordPress? v. 2.0 Евгений Котельницкий Kharkiv WordPress, 2016
  • 4. План 1. С чего мы начинали? 2. Что определяет уровень разработчика? 3. Через что проходит WP разработчик? 4. Что дальше?
  • 7. Шаг 1 - Регестрируем блог на WP.com
  • 8. Шаг 2 - Поднимаем WP на Shared-хостинге
  • 9. Шаг 3 - Устанавливаем темы
  • 10. Шаг 4 - Вносим правки в тему
  • 11. Шаг 5 - Устанавливаем плагины
  • 12. Шаг 6 - Изучаем админку
  • 13. WordPress User Roles User Roles ● Super Admin – site network administration; ● Administrator – administration features within a single site; ● Editor – can publish and manage posts of other users; ● Author – can publish and manage their own posts; ● Contributor – can write posts but cannot publish them; ● Subscriber – can only manage their profile.
  • 17. Начинаем создавать темы осмысленно Знакомимся с теорией: ● http://codex.wordpress.org/Theme_Development ● http://codex.wordpress.org/Template_Hierarchy ● http://codex.wordpress.org/Conditional_Tags ● ...
  • 18. Plugins & MU plugins
  • 19. Post Types Стандартные и пользовательские типы контента ● Post (post type: 'post') ● Page (post type: 'page') ● Attachment (post type: 'attachment') ● Revision (post type: 'revision') ● Navigation menu (post type: 'nav_menu_item') ● Custom Post Type (CPT): register_post_type()
  • 20. Taxonomies Стандартная и пользовательская систематика ● Category (taxonomy: 'category') ● Tag (taxonomy: 'post_tag') ● Link Category (taxonomy: 'link_category') ● Post Formats (taxonomy: 'post_format') ● Custom Taxonomies: register_taxonomy()
  • 21. Data Access API Получаем доступ к данным ● WP_Query ● WP_Tax_Query ● WP_User_Query ● get_posts () ● get_terms () ● get_option () ● get_post_meta () ● get_user_meta () ● ...
  • 23. Database Structure Получаем прямой доступ к данным
  • 24. Direct Database Access abstraction <?php global $wpdb; $wpdb->query( $wpdb->prepare( "DELETE FROM $wpdb->postmeta WHERE post_id = %d AND meta_key = %s", 13, 'gargle' ) ); ?>
  • 25. /** * WordPress Database Access Abstraction */ class wpdb { public function prepare( $query, $args ); public function show_errors( $show = true ); public function query( $query ); public function get_results( $query = null, $output = OBJECT ) { public function get_row( $query = null, $output = OBJECT, $y = 0 ); public function get_col( $query = null , $x = 0 ); public function get_var( $query = null, $x = 0, $y = 0 ); public function update( $table, $data, $where, $format = null, $where_format = null ); ... Direct Database Access abstraction
  • 26. Система хуков <?php do_action( $tag, $arg_a, $arg_b, $etc ); add_action( $tag, $function_to_add, $priority = 10, $accepted_args = 1 ); ?> <?php apply_filters( $tag, $value ); add_filter( $tag, $function_to_add, $priority, $accepted_args ); ?> Actions Filters
  • 29. Стандарты кодирования PHP Coding Standards HTML Coding Standards CSS Coding Standards JavaScript Standards
  • 31. Localization <?php load_textdomain( $domain, $mofile ); load_plugin_textdomain( $domain, $abs_rel_path, $plugin_rel_path ); ?> <?php $translated = __( 'Hello World!', 'domain' ); ?> <?php _e( 'Hello World!', 'domain' ) ?>
  • 32. Localization & JS <?php // Register the script first wp_register_script( 'some_handle', 'path/to/myscript.js' ); // Now we can localize the script with our data $translation = array( 'some_str' => __( 'Some string', 'domain' ), 'a_value' => '10' ); wp_localize_script( 'handle', 'object_name', $translation ); // The script can be enqueued now or later wp_enqueue_script( 'handle' );
  • 35. WP Network <?php switch_to_blog( $blog_id ); // Do something restore_current_blog(); ?>
  • 36. Network Database ● wp_blogs ● wp_blog_versions ● wp_registration_log ● wp_signups ● wp_site ● wp_sitemeta
  • 39. WordPress User Roles Super Admin capabilities ● manage_network ● manage_sites ● manage_network_users ● manage_network_plugins ● manage_network_themes ● manage_network_options ● ... Subscriber capabilities ● read
  • 40. WordPress User Roles class WP_Roles { /** * Add role name with capabilities to list. */ public function add_role( $role, $display_name, $capabilities = array() ); public function remove_role( $role ); /** * Add capability to role. */ public function add_cap( $role, $cap, $grant = true ); public function remove_cap( $role, $cap ); ...
  • 41. WordPress User class class WP_User { /** * Add role to user. */ public function add_role( $role ); public function remove_role( $role ); public function set_role( $role ); /** * Add capability and grant or deny access to capability. */ public function add_cap( $cap, $grant = true ); public function remove_cap( $cap ); ...
  • 42. class WP_User { /** * Whether user has capability or role name. * @return bool True, if user has capability; * false, if user does not have capability. */ public function has_cap( $cap ) { $caps = call_user_func_array( 'map_meta_cap', $args ); ... // Must have ALL requested caps $capabilities = apply_filters( 'user_has_cap', $this->allcaps, $caps, $args, $this ); ... WordPress User class
  • 43. Впервые задумываемся о безопасности
  • 45. Как работает WordPress? WordPress environment setup class class WP { /** * Sets up all of the variables required by the WordPress environment. * @param string|array $query_args Passed to {@link parse_request()} */ public function main($query_args = '') { $this->init(); $this->parse_request($query_args); $this->send_headers(); $this->query_posts(); $this->handle_404(); $this->register_globals(); do_action_ref_array( 'wp', array( &$this ) ); } ...
  • 47. WP_Rewrite - “Роутинг” class WP_Rewrite { /** * Retrieve the rewrite rules. * @return array Rewrite rules. */ public function wp_rewrite_rules() { $this->rules = get_option('rewrite_rules'); if ( empty($this->rules) ) { $this->matches = 'matches'; $this->rewrite_rules(); update_option('rewrite_rules', $this->rules); } return $this->rules; } ...
  • 48. WP_Rewrite - “Роутинг” Rewrite Rules <?php $rewrite = $wp_rewrite->wp_rewrite_rules(); array( [robots.txt$] => index.php?robots=1 [category/(.+?)/?$] => index.php?category_name=$matches[1] [page/?([0-9]{1,})/?$] => index.php?&paged=$matches[1] [search/(.+)/?$] => index.php?s=$matches[1] [([0-9]{4})/?$] => index.php?year=$matches[1] [.?.+?/attachment/([^/]+)/?$] => index.php?attachment=$matches[1] [(.?.+?)(/[0-9]+)?/?$] => index.php?pagename=$matches[1]&page=$matches[2] ...
  • 49. WP_Rewrite - “Роутинг” Rewrite Rules filters 1. apply_filters( 'post_rewrite_rules', $post_rewrite ); 2. apply_filters( 'date_rewrite_rules', $date_rewrite ); 3. apply_filters( 'root_rewrite_rules', $root_rewrite ); 4. apply_filters( 'comments_rewrite_rules', $comments_rewrite ); 5. apply_filters( 'search_rewrite_rules', $search_rewrite ); 6. apply_filters( 'author_rewrite_rules', $author_rewrite ); 7. apply_filters( 'page_rewrite_rules', $page_rewrite ); 8. apply_filters( $permastructname . '_rewrite_rules', $rules ); 9. apply_filters( 'rewrite_rules_array', $this->rules );
  • 50. WP_Rewrite - “Роутинг” WP_Rewrite::add_rule () // http://example.com/properties/123/ add_action( 'init', '_rewrites_init' ); function _rewrites_init() { add_rewrite_rule( 'properties/([0-9]+)/?$', 'index.php?pagename=properties&property_id=$matches[1]', 'top' ); } add_filter( 'query_vars', '_query_vars' ); function _query_vars( $query_vars ) { $query_vars[] = 'property_id'; return $query_vars; }
  • 51. WP_Rewrite - “Роутинг” WP_Rewrite::add_permastruct () <?php class WP_Rewrite { /** * Add a new permalink structure. */ public function add_permastruct( $name, $struct, $args = array() ) { ... $this->extra_permastructs[ $name ] = $args; } ... ?>
  • 52. WP_Rewrite - “Роутинг” WP_Rewrite::add_permastruct () <?php // http://example.com/au/some-prize-category/some-competition/ $wp_rewrite->add_rewrite_tag('%competition%', '([^/]+)', 'competition='); $wp_rewrite->add_rewrite_tag('%prize_category%', '([^/]+)', 'prize_category='); $wp_rewrite->add_permastruct( 'competition', '/au/%prize_category%/%competition%/', array( 'walk_dirs' => false )); ?>
  • 53. WP_Query - The Query class WordPress environment setup class class WP { /** * Sets up all of the variables required by the WordPress environment. * @param string|array $query_args Passed to {@link parse_request()} */ public function main($query_args = '') { $this->init(); $this->parse_request($query_args); $this->send_headers(); $this->query_posts(); $this->handle_404(); $this->register_globals(); do_action_ref_array( 'wp', array( &$this ) ); } ...
  • 54. WP_Query - The Query class The Main Query /** * WordPress environment setup class. */ class WP { /** * Set up the Loop based on the query variables. */ public function query_posts() { global $wp_the_query; $this->build_query_string(); $wp_the_query->query($this->query_vars); } ...
  • 55. WP_Query - The Query class class WP_Query { /** * Sets up the WordPress query by parsing query string. * @return array List of posts. */ public function query( $query ) { $this->init(); $this->query = $this->query_vars = wp_parse_args( $query ); return $this->get_posts(); } /** * Retrieve the posts based on query variables. * @return array List of posts. */ public function get_posts() { ... do_action_ref_array( 'pre_get_posts', array( &$this ) ); ...
  • 56. WP_Query - The Query class Query vars /** * Retrieve variable in the WP_Query class. * * @see WP_Query::get() * @uses $wp_query * * @return mixed */ function get_query_var( $var, $default = '' ) { global $wp_query; return $wp_query->get( $var, $default ); }
  • 60. Highload & Perfomance, Architecture, Supportability, Usability, UNIX/Linux CLI, Stability, Unit Testing, Continius integration, … Communication skills, Time management