Алгоритм маршрутизации для Wordpress - PullRequest
0 голосов
/ 15 мая 2019

Я не знаю точного значения вопроса, но кто-то задал мне этот вопрос в интервью.Я просто хочу знать, что что-то подобное, мы используем любой алгоритм маршрутизации в Wordpress?

1 Ответ

1 голос
/ 15 мая 2019

Это может быть хитрый вопрос, потому что маршрутизация будет означать отображение HTTP-запроса для запуска определенной функции или метода, который будет обрабатывать запрос, который не является тем, что делает WordPress (внизу есть раздел о WordPress). Проще говоря, вы читаете информацию HTTP-запроса, чтобы решить, какая функция будет запущена.

Немного подробнее в простых словах

если вы строите проект PHP с нуля и хотите отобразить определенный контент или вызвать метод / функцию, обычно есть два варианта (без маршрутизации)

Однако, если вы создали Маршрутизатор (алгоритм маршрутизации, как вы его назвали, или систему маршрутизации), то отправили все запросы в index.php и включили последний, скажем, что-то вроде этого:

// Include the Router class
require('classes/router.php');
// Include functions responsible for display our content
require('view/display.php');

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

Итак, если у вас есть маршрутизатор и функция для отображения формы контакта, например, вы бы добавили что-то вроде этого:

Router::add('/contact-us', get_contact_form(),'get');
Router::add('/contact-us', handle_contact_form(),'post');

Затем инициализируйте маршрутизатор

Router::initialize('/');

Опять же, при условии, что у вас есть полный Маршрутизатор, указанная выше функция сообщит файлу index.php, что запросы HTTP к этому URL будут обрабатываться иначе: http://example.com/contact-us

Если это тип запроса по умолчанию GET, активируйте эту функцию get_contact_form(), но если тип запроса POST, активируйте эту handle_contact_form(), которая будет действовать и отображать содержимое по-разному в зависимости от ваших потребностей.

Это здорово, потому что это было бы вместо чего-то вроде

http://example.com/index.php?page=contact-us

Содержимое index.php будет обрабатывать запрос иначе, поскольку маршрутизатор отсутствует.

// Include functions responsible for display our content
require('view/display.php');

if( isset($_GET['page']) && $_GET['page'] == 'contact-us'){
    echo get_contact_form();
}

if( isset($_GET['page']) && $_GET['page'] == 'contact-us' && isset($_POST['contact_submit']) ){
    echo handle_contact_form();
}

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

Итак, вернемся к WordPress

Если у вас новая установка, вы заметите, что URL выглядит примерно так:

http://example.com/?p=62
http://example.com/?cat=1
http://example.com/?author=3

Таким образом, он просто взял бы параметры URL, а затем построил WP_Query на основе этого, если это p, тогда ищите сообщения в базе данных по ID, если cat, тогда ищите категории по ID и так далее ... (это простое объяснение, конечно, в фоновом режиме многое происходит, но только для того, чтобы дать представление).

После изменения структуры постоянной ссылки вы можете заметить, что приведенные выше примеры теперь будут выглядеть примерно так:

http://example.com/post-slug
http://example.com/author/name
http://example.com/category/uncategorized

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

При запросе URL-адреса (pretty-link) в WordPress первое, что происходит, это то, что .htaccess ищет папку / файл с тем же именем на сервере, если он существует, он будет обслуживаться, если нет, он будет отправить этот запрос в файл index.php, который делает одну вещь:

/** Loads the WordPress Environment and Template */
require( dirname( __FILE__ ) . '/wp-blog-header.php' );

загрузка файла wp-blog-header.php, который выполнит небольшую проверку, чтобы убедиться, что код выполняется только один раз, а затем:

// Load the WordPress library.
require_once( dirname(__FILE__) . '/wp-load.php' );

// Set up the WordPress query.
wp();

// Load the theme template.
require_once( ABSPATH . WPINC . '/template-loader.php' ); 

Давайте не будем углубляться в эти файлы, нас больше всего беспокоит то, что делают 'wp-load.php' и 'template-loader.php'

сор-load.php

Этот, помимо прочего, ищет wp-config, удостоверится, что все настроено правильно, затем подключается к базе данных, конечно, после большой инициализации, настройки констант, загружающих множество файлов, которые обрабатывают различные части структуры WordPress.,Частью этого процесса является то, что WordPress пытается сопоставить URL-адрес запроса с большим набором правил, называемых правила перезаписи , которые установлены из регулярных выражений , когда совпадение найдено, WordPress переведет этоURL в запрос к базе данных, используя класс [WP_Query][1], который расположен в wp-includes/class-wp-query.php, и этот класс будет сохранять результаты запроса среди прочего (тип запроса ... и т. Д.)

template-loader.php

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...