PHP – серверный язык, на котором собран WordPress: темы, плагины, цикл запросов, работа с БД. Ниже сжатый обзор для тех, кто пишет под WP или делает динамические страницы: синтаксис, БД, формы, сессии, безопасность и типичные точки входа в ядре WordPress.
Что такое PHP и зачем он на сайте
PHP (Hypertext Preprocessor) выполняется на сервере. Скрипт получает запрос, при необходимости ходит в базу, собирает HTML и отдаёт его браузеру. Статическая HTML-страница всегда одна и та же; PHP-страница зависит от пользователя, параметров URL, сессии и данных в MySQL/MariaDB.
Язык появился в 1994 году (Rasmus Lerdorf) как набор CGI-скриптов и вырос в экосистему с огромным числом хостингов «из коробки». Для WordPress это не опция, а фундамент: без PHP ядро, темы и плагины не работают.
Плюсы и минусы в контексте веба
- Плюсы: низкий порог входа, нативная поддержка на shared-хостинге, большое сообщество, прямая связь с HTML, зрелые расширения для БД, сессий, JSON, curl.
- Минусы: легко написать небезопасный код (инъекции, XSS), legacy-проекты с «лапшой», производительность и архитектура зависят от дисциплины разработчика.
С JavaScript PHP не конкурирует напрямую: JS в браузере (и Node.js на сервере), PHP почти всегда серверный. Python с Django/Flask силён в своих стеках, но для типичного WP-хостинга и готовой CMS-экосистемы PHP остаётся практичным выбором.
Роль PHP в WordPress
При открытии страницы WP PHP поднимает окружение, читает настройки, ходит в БД, применяет фильтры и экшены, подключает шаблон темы и выводит HTML. Плагины и child-темы – это в первую очередь PHP-файлы с хуками.
- Контент (посты, мета, пользователи) лежит в MySQL; PHP формирует запросы через API WordPress.
- Класс
WP_Query(не функцияwp_query()) – основной способ выбирать посты по критериям. - Глобальный объект
$wpdb– низкоуровневый доступ к таблицам с prepared statements. - Темы:
header.php,single.php,page.phpи hierarchy шаблонов. - Плагины: регистрация хуков
add_action/add_filter.
Минимальный пример цикла в теме:
<?php
if ( have_posts() ) :
while ( have_posts() ) :
the_post();
the_title( '<h1>', '</h1>' );
the_content();
endwhile;
endif;
?>
Свой запрос через WP_Query:
<?php
$q = new WP_Query( array(
'post_type' => 'post',
'posts_per_page' => 5,
'category_name' => 'news',
) );
if ( $q->have_posts() ) {
while ( $q->have_posts() ) {
$q->the_post();
the_title( '<h2>', '</h2>' );
}
wp_reset_postdata();
}
?>
Локальная среда и базовый синтаксис
Для разработки удобны Local WP, Docker, Laravel Herd, XAMPP/MAMP или связка Nginx/Apache + PHP-FPM + MariaDB. Нужны PHP (лучше актуальная поддерживаемая ветка), веб-сервер и СУБД. На проде конфиг Apache/Nginx должен отдавать .php в PHP-FPM/модуль, а не как текст.
Код PHP обычно оборачивают в теги <?php ... ?>. Переменные начинаются с $, массивы – [] или array(), управление потоком – if/else, foreach, for, while. Функции дробят логику; классы и ООП помогают держать структуру в плагинах и крупных темах.
<?php
$name = 'World';
$items = array( 'alpha', 'beta', 'gamma' );
function greet( $who ) {
return 'Hello, ' . $who;
}
echo greet( $name );
foreach ( $items as $item ) {
echo $item . "\n";
}
?>
Регулярные выражения: preg_match(), preg_replace() – для проверки форматов и очистки строк. Файлы: file_get_contents(), file_put_contents(), либо классика fopen/fread/fwrite/fclose. В WordPress для путей и загрузок лучше опираться на API (wp_upload_dir, Filesystem API), а не на «голые» пути вслепую.
Работа с MySQL: CRUD и защита
В «чистом» PHP к MySQL ходят через MySQLi или PDO. CRUD – Create/Read/Update/Delete (INSERT, SELECT, UPDATE, DELETE). PDO универсальнее (разные СУБД), MySQLi заточен под MySQL. В WordPress предпочтительнее $wpdb и высокоуровневые функции (get_posts, update_post_meta и т.д.), а не прямой SQL без нужды.
Пример prepared statement через PDO (вне WP):
<?php $pdo = new PDO( 'mysql:host=localhost;dbname=app;charset=utf8mb4', 'user', 'pass', array( PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION ) ); $stmt = $pdo->prepare( 'SELECT id, title FROM posts WHERE id = ?' ); $stmt->execute( array( $id ) ); $row = $stmt->fetch( PDO::FETCH_ASSOC ); ?>
В WordPress аналог с экранированием плейсхолдеров:
<?php
global $wpdb;
$row = $wpdb->get_row(
$wpdb->prepare(
"SELECT ID, post_title FROM {$wpdb->posts} WHERE ID = %d",
$id
)
);
?>
SQL-инъекции блокируют подготовленными запросами и плейсхолдерами, а не конкатенацией пользовательского ввода в SQL-строку. Экранирование вывода в HTML – отдельная история: esc_html, esc_attr, esc_url в WP; вне WP – htmlspecialchars.
Динамические страницы, шаблоны, формы
Простейший динамический файл – HTML с вкраплениями PHP. В WordPress логику и разметку разделяют hierarchy шаблонов темы, partials (get_template_part) и, при желании, современные блоки/FSE. Twig и подобные движки популярны во фреймворках (Symfony и др.); в классическом WP чаще PHP-шаблоны темы, иногда кастомный шаблонизатор в крупном проекте.
Форма: метод POST, серверная валидация, nonce в WordPress, затем сохранение или письмо. Схематично вне WP:
<?php
// form.html: <form method="post" action="handle.php">...
$email = filter_input( INPUT_POST, 'email', FILTER_VALIDATE_EMAIL );
if ( ! $email ) {
exit( 'Некорректный email' );
}
// дальше: сохранение, письмо, редирект
?>
В плагине WordPress для admin-post или AJAX добавляют check_admin_referer / wp_verify_nonce, capability checks и санитизацию (sanitize_text_field, sanitize_email).
Сессии, куки, пароли
Сессии (session_start(), $_SESSION) хранят состояние между запросами. Куки – данные на стороне клиента; их нельзя считать доверенными без проверки. В WordPress своя система пользователей и cookies авторизации: для кастомной «логики входа» безопаснее опираться на API WP (wp_signon, roles/capabilities), чем городить параллельную сессионную схему.
Пароли: только хеш, никогда plaintext. В PHP:
<?php
$hash = password_hash( $password, PASSWORD_DEFAULT );
if ( password_verify( $password, $hash ) ) {
// ok
}
?>
Чувствительные данные при необходимости шифруют (libsodium / OpenSSL), ключи не кладут в репозиторий. На хостинге – HTTPS, актуальный PHP, минимум плагинов с сомнительным кодом.
Практические акценты для WordPress-разработчика
- Пишите в child-теме или плагине, не в core и не в «родительской» теме из репозитория без форка.
- Используйте хуки вместо правок ядра.
- Всегда prepared statements /
$wpdb->prepareдля своего SQL. - Экранируйте вывод; для HTML-контента из админки – осознанный whitelist, не слепой echo.
- Следите за версией PHP на хостинге: старые ветки без security-фиксов – риск.
- Документация: developer.wordpress.org важнее устаревшего Codex для нового кода.
Кратко
PHP даёт серверную динамику: БД, формы, шаблоны, доступ. WordPress добавляет поверх этого API запросов, хуки, пользователей и экосистему тем/плагинов. Освоить язык стоит не «в вакууме», а вместе с безопасным вводом-выводом и API WP – тогда кастомизация сайта остаётся поддерживаемой, а не набором хаков.