Функция get_posts_by_author_sql()
в WordPress позволяет получить SQL-условие WHERE
для выборки записей, основываясь на статусе публикации, авторе и типе записи. Она учитывает права пользователя, что позволяет автоматически включать или исключать частные записи (private
) в зависимости от прав текущего пользователя.
get_posts_by_author_sql( string|string[] $post_type, bool $full = true, int $post_author = null, bool $public_only = false ): string
Параметры
$post_type
(строка или массив, обязательный): Тип записи или массив типов записей, для которых будет создано условие.$full
(логический, необязательный): Еслиtrue
, функция возвращает полное SQL-условиеWHERE
. Еслиfalse
, возвращает условие безWHERE
.$post_author
(целое число, необязательный): ID автора, по которому будет фильтроваться выборка. Если не задан, используется текущий пользователь.$public_only
(логический, необязательный): Еслиtrue
, возвращает только публичные записи, исключая частные даже для авторизованных пользователей.
Возвращаемое значение
Возвращает строку SQL, которую можно добавить в раздел WHERE
SQL-запроса.
Базовое использование функции для типа записи
<?php
$where = get_posts_by_author_sql('post');
echo $where;
// Если пользователь авторизован: WHERE (post_type = 'post' AND (post_status = 'publish' OR post_status = 'private'))
// Если пользователь не авторизован: WHERE (post_type = 'post' AND post_status = 'publish')
?>
Здесь строка WHERE
будет включать или исключать частные записи в зависимости от того, авторизован ли пользователь.
Пример с указанием автора
<?php
$author_id = 5; // ID автора, которого мы хотим отфильтровать
$where = get_posts_by_author_sql('custom_type', true, $author_id);
echo $where;
// Пример результата: WHERE (post_type = 'custom_type' AND post_author = 5 AND (post_status = 'publish' OR post_status = 'private'))
?>
В данном примере post_author
установлен на ID 5
, и фильтрация будет применена только к записям данного автора.
Использование $public_only
для фильтрации только публичных записей
<?php
$where = get_posts_by_author_sql(['post', 'page'], true, null, true);
echo $where;
// Результат для авторизованного и неавторизованного пользователя: WHERE (post_type IN ('post', 'page') AND post_status = 'publish')
?>
В этом примере используется $public_only = true
, так что функция будет возвращать только публичные записи вне зависимости от авторизации пользователя.
Получение ID записи с определенным заголовком
<?php
global $wpdb;
$where = get_posts_by_author_sql('post');
$query = "SELECT ID FROM $wpdb->posts $where AND post_title = %s";
$post_id = $wpdb->get_var($wpdb->prepare($query, 'Пример заголовка'));
echo $post_id;
?>
Здесь get_posts_by_author_sql()
используется в составе более сложного SQL-запроса для поиска записи по заголовку. Условие $where
динамически адаптируется в зависимости от прав доступа текущего пользователя.
Создание выборки для частных записей текущего пользователя
<?php
$user_id = get_current_user_id();
$where = get_posts_by_author_sql('private_posts', true, $user_id);
echo $where;
// Пример результата для авторизованного пользователя: WHERE (post_type = 'private_posts' AND post_author = $user_id AND post_status = 'private')
?>
Этот пример создает SQL-запрос, который возвращает только частные записи текущего пользователя для типа private_posts
.
Важные замечания
get_posts_by_author_sql()
полезна для создания безопасных запросов, учитывающих уровень доступа к записям.- Значение
$public_only = true
исключает из выборки частные записи для всех пользователей, включая администраторов. - Функция автоматически использует права текущего пользователя, но позволяет явно указать ID автора, если требуется выбрать записи другого пользователя.
Заключение
Функция get_posts_by_author_sql()
позволяет гибко создавать SQL-условия WHERE
для выборки записей, соблюдая права доступа и фильтры по автору и статусу публикации.