SlideShare a Scribd company logo
Как получить чёрный пояс
по WordPress?
Евгений Котельницкий
WordCamp Russia 2015
Евгений Котельницкий
+YevhenKotelnytskyi
@yeeevhen
http://4coder.info/me
Как получить чёрный пояс по WordPress?
План
1. Что определяет уровень разработчика?
2. Через что проходит WP разработчик?
3. Что дальше?
Как получить чёрный пояс по WordPress?
Как получить чёрный пояс по WordPress?
Шаг 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
The Origin of Lithium
KEY
Api Design
PDF
Be RESTful (Symfony Camp 2008)
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
Unit and Functional Testing with Symfony2
PDF
Lithium: The Framework for People Who Hate Frameworks
PDF
Rich Model And Layered Architecture in SF2 Application
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
The Origin of Lithium
Api Design
Be RESTful (Symfony Camp 2008)
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
Unit and Functional Testing with Symfony2
Lithium: The Framework for People Who Hate Frameworks
Rich Model And Layered Architecture in SF2 Application
Ad

Viewers also liked (10)

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

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

PPTX
WordPress Plugin development
PPT
Hardcore URL Routing for WordPress - WordCamp Atlanta 2014 (PPT)
PPTX
Coming to Terms with OOP In Drupal - php[world] 2016
PPTX
You don’t know query - WordCamp UK Edinburgh 2012
PDF
Why is crud a bad idea - focus on real scenarios
PDF
Becoming a better WordPress Developer
PDF
Laying the proper foundation for plugin and theme development
PPTX
Drupal 8 migrate!
PDF
Extending the WordPress REST API - Josh Pollock
PDF
Image manipulation in WordPress 3.5
PDF
WordPress Queries - the right way
PDF
関西PHP勉強会 php5.4つまみぐい
PDF
Drupal vs WordPress
PDF
WordPress London 16 May 2012 - You don’t know query
PDF
Best Practices in Plugin Development (WordCamp Seattle)
PDF
WordPress REST API hacking
PDF
[WLDN] Supercharging word press development in 2018
PDF
Unittests für Dummies
PDF
WCLA12 JavaScript
PDF
Getting to The Loop - London Wordpress Meetup July 28th
WordPress Plugin development
Hardcore URL Routing for WordPress - WordCamp Atlanta 2014 (PPT)
Coming to Terms with OOP In Drupal - php[world] 2016
You don’t know query - WordCamp UK Edinburgh 2012
Why is crud a bad idea - focus on real scenarios
Becoming a better WordPress Developer
Laying the proper foundation for plugin and theme development
Drupal 8 migrate!
Extending the WordPress REST API - Josh Pollock
Image manipulation in WordPress 3.5
WordPress Queries - the right way
関西PHP勉強会 php5.4つまみぐい
Drupal vs WordPress
WordPress London 16 May 2012 - You don’t know query
Best Practices in Plugin Development (WordCamp Seattle)
WordPress REST API hacking
[WLDN] Supercharging word press development in 2018
Unittests für Dummies
WCLA12 JavaScript
Getting to The Loop - London Wordpress Meetup July 28th

Recently uploaded (20)

PPTX
ManageIQ - Sprint 268 Review - Slide Deck
PDF
Design an Analysis of Algorithms II-SECS-1021-03
PDF
Wondershare Filmora 15 Crack With Activation Key [2025
PDF
Softaken Excel to vCard Converter Software.pdf
PPTX
Agentic AI : A Practical Guide. Undersating, Implementing and Scaling Autono...
PPTX
CHAPTER 12 - CYBER SECURITY AND FUTURE SKILLS (1) (1).pptx
PDF
Understanding Forklifts - TECH EHS Solution
PDF
2025 Textile ERP Trends: SAP, Odoo & Oracle
PDF
Internet Downloader Manager (IDM) Crack 6.42 Build 42 Updates Latest 2025
PPTX
Introduction to Artificial Intelligence
PDF
T3DD25 TYPO3 Content Blocks - Deep Dive by André Kraus
PDF
AI in Product Development-omnex systems
PDF
Nekopoi APK 2025 free lastest update
PPTX
Online Work Permit System for Fast Permit Processing
PDF
top salesforce developer skills in 2025.pdf
PDF
Why TechBuilder is the Future of Pickup and Delivery App Development (1).pdf
PDF
Raksha Bandhan Grocery Pricing Trends in India 2025.pdf
PDF
How Creative Agencies Leverage Project Management Software.pdf
PPTX
Odoo POS Development Services by CandidRoot Solutions
PPTX
CHAPTER 2 - PM Management and IT Context
ManageIQ - Sprint 268 Review - Slide Deck
Design an Analysis of Algorithms II-SECS-1021-03
Wondershare Filmora 15 Crack With Activation Key [2025
Softaken Excel to vCard Converter Software.pdf
Agentic AI : A Practical Guide. Undersating, Implementing and Scaling Autono...
CHAPTER 12 - CYBER SECURITY AND FUTURE SKILLS (1) (1).pptx
Understanding Forklifts - TECH EHS Solution
2025 Textile ERP Trends: SAP, Odoo & Oracle
Internet Downloader Manager (IDM) Crack 6.42 Build 42 Updates Latest 2025
Introduction to Artificial Intelligence
T3DD25 TYPO3 Content Blocks - Deep Dive by André Kraus
AI in Product Development-omnex systems
Nekopoi APK 2025 free lastest update
Online Work Permit System for Fast Permit Processing
top salesforce developer skills in 2025.pdf
Why TechBuilder is the Future of Pickup and Delivery App Development (1).pdf
Raksha Bandhan Grocery Pricing Trends in India 2025.pdf
How Creative Agencies Leverage Project Management Software.pdf
Odoo POS Development Services by CandidRoot Solutions
CHAPTER 2 - PM Management and IT Context

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

  • 1. Как получить чёрный пояс по WordPress? Евгений Котельницкий WordCamp Russia 2015
  • 4. План 1. Что определяет уровень разработчика? 2. Через что проходит WP разработчик? 3. Что дальше?
  • 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 () ● ...
  • 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