PHP для динамических страниц и разработки на WordPress

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 – тогда кастомизация сайта остаётся поддерживаемой, а не набором хаков.

Источники и ссылки


Комментарии загружаются…