Как получить все заголовки постов, начинающиеся с чисел и символов?

Вопрос или проблема

Я хочу получить все посты, которые начинаются с цифры (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);

Заключение

Таким образом, вы можете эффективно извлекать все заголовки постов, которые начинаются с чисел или символов. Данный метод не только производителен, но и позволяет удерживать ваш код чистым и поддерживаемым. Регулярные выражения предоставляют высокую гибкость при фильтрации данных, что может быть полезно для различных сценариев.

Постарайтесь протестировать ваш код в безопасной среде, прежде чем развертывать в рабочей версии сайта.

Оцените материал
Добавить комментарий

Капча загружается...