Вопрос или проблема
Я хочу получить все посты, которые начинаются с цифры (0-9) или символов, в списке. Мне удалось сделать это для букв, но с этим у меня сложнее. Может кто-то мне помочь?
Я попробовал добавить это в мой существующий код, но это не сработало:
$this_char = strtoupper(mb_substr($post->post_title, 0, 1, 'UTF-8'));
if (strpos('0123456789',$this_char) !== false) $this_char="0-9";
if ($this_char != $last_char) {
Это мой код:
<?php
$first_char="A";
$postids=$wpdb->get_col($wpdb->prepare("
SELECT ID
FROM $wpdb->posts
WHERE SUBSTR($wpdb->posts.post_title,1,1) = %s
ORDER BY $wpdb->posts.post_title",$first_char));
if ($postids) {
$args=array(
'post__in' => $postids,
'post_type' => 'post',
'post_status' => 'publish',
'posts_per_page' => -1,
'caller_get_posts'=> 1,
'orderby'=> 'title',
'order' => 'ASC'
);
$my_query = null;
$my_query = new WP_Query($args);
if( $my_query->have_posts() ) {
echo 'test test '. $first_char;
while ($my_query->have_posts()): $my_query->the_post();
?>
<li><h1><a href="https://wordpress.stackexchange.com/questions/103160/<?php the_permalink() ?>" rel="bookmark" title="Постоянная ссылка на <?php the_title_attribute(); ?>"><?php the_title(); ?></a>
</h1> </li>
<?php
endwhile;
}
wp_reset_query(); // Восстановить данные глобального поста, затертые the_post().
}
?>
</ul>
</div>
Примечание: Я хочу, чтобы все эти символы и цифры были на одной странице.
Подключитесь к фильтру posts_where
и добавьте ваше условие к запросу:
add_filter('posts_where', function($where){
global $wpdb;
return "{$where} AND {$wpdb->posts}.post_title REGEXP '^[0-9\$\@\!\?\%]'";
// добавьте другие символы в регулярное выражение выше ^
});
Затем выполните ваш запрос:
$my_query = new WP_Query(...);
Вы можете удалить фильтр после получения результатов (сделайте это обычной функцией, чтобы вы могли передать имя в remove_filter
).
Ответ или решение
Чтобы получить все названия постов, которые начинаются с цифр (0-9) или символов, в WordPress, вам понадобится использовать фильтр posts_where
, чтобы изменить условие выборки в SQL-запросе. Этот способ позволит эффективно находить посты, которые соответствуют вашим критериям, без необходимости перебора всех постов.
Ниже представлены шаги, которые помогут вам сделать это, включая необходимые фрагменты кода.
Шаг 1: Добавление фильтра posts_where
Для начала вы можете добавить следующий код в файл вашей темы (например, в functions.php
) или в ваш плагин. Этот код использует регулярные выражения, чтобы отфильтровать заголовки постов:
add_filter('posts_where', function($where) {
global $wpdb;
return "{$where} AND {$wpdb->posts}.post_title REGEXP '^[0-9\$\@\!\?\%]'";
// Добавьте другие символы в регулярное выражение по желанию
});
В данном регулярном выражении ^[0-9\$\@\!\?\%]
обозначает, что заголовок поста должен начинаться с цифры или указанного символа.
Шаг 2: Выполнение запроса к постам
После добавления фильтра, вы можете выполнять запрос к постам с использованием WP_Query
. Пример запроса показан ниже:
$args = array(
'post_type' => 'post',
'post_status' => 'publish',
'posts_per_page' => -1, // Получение всех постов
'orderby' => 'title',
'order' => 'ASC'
);
$my_query = new WP_Query($args);
if ($my_query->have_posts()) {
echo '<ul>';
while ($my_query->have_posts()) {
$my_query->the_post();
echo '<li><h1><a href="' . get_permalink() . '" rel="bookmark" title="Permanent Link to ' . get_the_title() . '">' . get_the_title() . '</a></h1></li>';
}
echo '</ul>';
}
wp_reset_postdata(); // Восстановить глобальные данные поста
Шаг 3: Удаление фильтра (опционально)
Если вам нужно использовать ваш фильтр только в определенных случаях, вы можете создать анонимную функцию и затем удалить фильтр после выполнения запроса:
add_filter('posts_where', $function_name);
$my_query = new WP_Query($args);
// Удаляем фильтр после выполнения запроса
remove_filter('posts_where', $function_name);
Заключение
Таким образом, вы можете эффективно извлекать все заголовки постов, которые начинаются с чисел или символов. Данный метод не только производителен, но и позволяет удерживать ваш код чистым и поддерживаемым. Регулярные выражения предоставляют высокую гибкость при фильтрации данных, что может быть полезно для различных сценариев.
Постарайтесь протестировать ваш код в безопасной среде, прежде чем развертывать в рабочей версии сайта.