Вопрос или проблема
Из-за отсутствия репутации, я теперь должен задать вопрос. Я хочу создать поиск всех изображений в медиа-библиотеке. Результат поиска должен появляться только в том случае, если вы ищете точное название изображения. Я уже пробовал это с ‘exact’ => true, но это не работает. Все равно отображаются похожие изображения. Я создал запрос с следующими параметрами:
<?php
$args = array(
'post_type' => 'attachment',
'post_mime_type' => 'image',
'orderby' => 'post_date',
'order' => 'desc',
'posts_per_page' => '30',
'post_status' => 'inherit',
);
$loop = new WP_Query( $args );
while ( $loop->have_posts() ) : $loop->the_post();
$image = wp_get_attachment_image_src( get_the_ID() );
echo "<img src="" . $image[0] . "">";
endwhile; ?>
Надеюсь, кто-то сможет мне помочь.
Попробуйте что-то подобное
Обратное этому: https://wordpress.stackexchange.com/a/209714/180599
<?php
global $wpdb;
//Обратное этому: https://wordpress.stackexchange.com/a/209714/180599
$supported_mimes = array( 'image/jpeg', 'image/gif', 'image/png', 'image/bmp', 'image/tiff', 'image/x-icon' );
$all_mimes = get_allowed_mime_types();
$accepted_mimes = array_diff($supported_mimes, $all_mimes);
//и...
$keyword = stripslashes($_REQUEST['keyword']);
//$search = $wpdb->get_col( $wpdb->prepare( " SELECT DISTINCT ID FROM {$wpdb->posts} WHERE post_title="%s" OR post_content="%s" ", $keyword, $keyword ) );
$search = $wpdb->get_col( $wpdb->prepare( " SELECT DISTINCT ID FROM {$wpdb->posts} WHERE post_title="%s" ", $keyword ) );
$query = array(
'post_type' => 'attachment',
'post_status' => 'inherit',
'orderby' => 'date',
'order' => 'DESC',
'posts_per_page' => 10,
'post_mime_type' => $accepted_mimes,
'post__in' => $search,
);
$attachments = new WP_Query($query);
while($attachments->have_posts()):
$attachments->the_post();
echo $attachment->post_content.'<br>';
echo $attachment->post_title.'<br>';
//echo wp_get_attachment_image_src($attachment->ID, 'medium', true )[0].'<hr>';
echo wp_get_attachment_url($attachment->ID).'<hr>';
endwhile;
?>
.
Ответ или решение
Чтобы создать WordPress-запрос (WP Query), который будет искать медиафайлы (в основном изображения) по точному заголовку, вам нужно будет внести некоторые изменения в ваш код. Ваша задача — ограничить результаты поиска только теми вложениями, заголовки которых точно совпадают с введенным запросом. Давайте рассмотрим, как это можно осуществить.
1. Настройка параметров запроса
Вы используете класс WP_Query
для выполнения вашего запроса. Однако вам необходимо обратиться к базе данных напрямую, чтобы получить идентификаторы вложений с точным соответствием заголовка.
2. Запрос к базе данных
Для получения всех изображений с точным заголовком, сначала необходимо получить список идентификаторов постов напрямую через $wpdb
. Мы можем использовать метод prepare
для безопасного выполнения SQL-запроса, чтобы предотвратить SQL-инъекции.
Вот как это сделать:
<?php
global $wpdb;
// Получите точное ключевое слово из запроса
$keyword = stripslashes($_REQUEST['keyword']);
// Выполните запрос для получения идентификаторов постов с точным совпадением заголовка
$search = $wpdb->get_col($wpdb->prepare(
"SELECT DISTINCT ID FROM {$wpdb->posts} WHERE post_title = %s AND post_type = 'attachment' AND post_status = 'inherit'", $keyword
));
// Если идентификаторы найдены, создаем новый запрос WP_Query
if (!empty($search)) {
$query_args = array(
'post_type' => 'attachment',
'post_status' => 'inherit',
'orderby' => 'date',
'order' => 'DESC',
'posts_per_page' => 10,
'post__in' => $search,
);
$attachments = new WP_Query($query_args);
// Цикл для вывода результатов
if ($attachments->have_posts()) {
while ($attachments->have_posts()) {
$attachments->the_post();
$image_src = wp_get_attachment_image_src(get_the_ID(), 'medium');
echo '<img src="' . esc_url($image_src[0]) . '" alt="' . esc_attr(get_the_title()) . '"><br>';
echo 'Заголовок: ' . esc_html(get_the_title()) . '<br>';
echo 'Ссылка: ' . esc_url(get_attachment_link(get_the_ID())) . '<br><hr>';
}
wp_reset_postdata(); // Сброс данных запроса
} else {
echo 'Изображения не найдены с таким заголовком.';
}
} else {
echo 'Идентификаторы вложений не найдены.';
}
?>
3. Объяснение кода
-
Получение ключевого слова: Мы используем
stripslashes()
для обработки введенного пользователем текста, чтобы избежать проблем с экранированием. -
Запрос к базе данных: SQL-запрос выбирает уникальные ID всех вложений, заголовки которых совпадают с введенным термином. Мы также проверяем, чтобы найденные посты были именно вложениями (post_type = ‘attachment’) и имели статус ‘inherit’.
-
Запрос WP_Query: Если слова найдены, мы создаем новый
WP_Query
, используя найденные ID. -
Цикл вывода: Подключаем схему выдачи, где для каждого вложения выводится изображение, его заголовок и ссылка.
-
Безопасность: Код защищен от SQL-инъекций через метод
prepare()
, что делает его безопаснее.
Заключение
Этот код обеспечивает точный поиск изображений в медиабиблиотеке вашего WordPress-сайта. ИспользуяSQL-запрос для получения идентификаторов и WP_Query
для их отображения, вы можете эффективно управлять выводом вложений, гарантируя, что отображаются только те, заголовки которых точно совпадают с запросом пользователя. Такой подход не только повышает качество поиска, но и улучшает взаимодействие пользователей с вашим сайтом.