Как выполнить выборку постов с категорией и тегами?

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

Я хочу получить несколько постов с категориями и метками. В настоящее время я использую следующий запрос:

$pagesize = 20;
$pageNumber = 1;

$mysql = mysqli_query($con,"SELECT p.post_title,
     p.ID,
     p.post_content,
     p.post_date,
     p.post_name as url,
     t.name as category_name
FROM wp_posts p,
     wp_terms t,
     wp_term_relationships r,
     wp_term_taxonomy tt
WHERE p.post_status='publish' AND
     tt.taxonomy = 'post_tag' AND
     p.id=r.object_id AND
     r.term_taxonomy_id=tt.term_taxonomy_id AND
     tt.term_id = t.term_id
ORDER BY p.post_date desc 
LIMIT ".(int)($pageNumber*$pageSize).",".(int)$pageSize."") or die ("ошибка".mysqli_error($con));

Соединение mysqli работает. Но когда я запускаю этот код, я получаю только пустую страницу. Как я могу это исправить?

1) Пустая страница в WordPress означает, что в вашем коде есть фатальная ошибка PHP. Также оператор or die() может вызывать белую страницу. Не используйте or die() в производственном коде, вместо этого используйте try .. catch.

2) Кроме того, я настоятельно не рекомендую вам использовать функции mysqli_* в WordPress. Всегда используйте $wpdb для доступа к БД!

3) В вашем запросе есть некоторые проблемы, но они не вызовут пустую страницу, а могут привести к неправильным результатам.

4) В этом случае вы, возможно, захотите использовать основные функции WP. Например, get_posts() и get_the_category().

Включите debug (в true), это позволит вам увидеть ошибку.

Ответ или решение

Конечно! Давайте разберёмся с вашей задачей по выборке постов с категориями и тегами в WordPress.

1. Проблема с пустой страницей

Пустая страница в WordPress может указывать на наличие фатальной ошибки PHP. Конструкция or die() может не отображать всю информацию о причине ошибки. Я рекомендую включить режим отладки, установив в вашем файле wp-config.php следующую строку:

define('WP_DEBUG', true);

Это позволит вам видеть сообщения об ошибках на экране.

2. Замечание о mysqli

Не рекомендуется использовать mysqli_* функции в WordPress. Вместо этого вы должны использовать класс $wpdb, который предоставляет удобные функции для работы с базой данных. Это значительно упростит вашу работу и повысит безопасность вашего кода.

3. Использование $wpdb

Ниже приведён пример того, как можно использовать $wpdb для выполнения вашего запроса с выборкой постов, категорий и тегов.

global $wpdb;

$pagesize = 20;
$pageNumber = 1;
$offset = ($pageNumber - 1) * $pagesize;

$query = "
    SELECT p.post_title,
           p.ID,
           p.post_content,
           p.post_date,
           p.post_name as url,
           GROUP_CONCAT(DISTINCT t.name) as category_name,
           GROUP_CONCAT(DISTINCT tt.taxonomy) as tag_name
    FROM {$wpdb->posts} p
    LEFT JOIN {$wpdb->term_relationships} r ON p.ID = r.object_id
    LEFT JOIN {$wpdb->term_taxonomy} tt ON r.term_taxonomy_id = tt.term_taxonomy_id
    LEFT JOIN {$wpdb->terms} t ON tt.term_id = t.term_id
    WHERE p.post_status = 'publish'
    GROUP BY p.ID
    ORDER BY p.post_date DESC
    LIMIT %d, %d
";

$results = $wpdb->get_results($wpdb->prepare($query, $offset, $pagesize));

if (!empty($results)) {
    foreach ($results as $post) {
        echo '<h2>' . esc_html($post->post_title) . '</h2>';
        echo '<div>' . esc_html($post->post_content) . '</div>';
        echo '<p>Опубликовано: ' . esc_html($post->post_date) . '</p>';
        echo '<p>Категории: ' . esc_html($post->category_name) . '</p>';
        echo '<p>Теги: ' . esc_html($post->tag_name) . '</p>';
    }
} else {
    echo 'Нет постов для отображения.';
}

4. Альтернативный подход: использование get_posts()

Вместо забирания данных через прямой SQL-запрос, вы также можете использовать функцию get_posts() с параметрами для получения постов. Это более предпочтительный способ, поскольку он использует внутренние функции WordPress и упрощает работу:

$args = array(
    'posts_per_page' => $pagesize,
    'paged' => $pageNumber,
    'post_status' => 'publish',
);

$posts = get_posts($args);

if (!empty($posts)) {
    foreach ($posts as $post) {
        setup_postdata($post);
        $categories = get_the_category($post->ID);
        $tags = get_the_tags($post->ID);

        echo '<h2>' . esc_html(get_the_title($post)) . '</h2>';
        echo '<div>' . esc_html(get_the_content($post)) . '</div>';
        echo '<p>Опубликовано: ' . esc_html(get_the_date('', $post)) . '</p>';

        if (!empty($categories)) {
            echo '<p>Категории: ' . esc_html(implode(', ', wp_list_pluck($categories, 'name'))) . '</p>';
        }

        if (!empty($tags)) {
            echo '<p>Теги: ' . esc_html(implode(', ', wp_list_pluck($tags, 'name'))) . '</p>';
        }
    }
    wp_reset_postdata();
} else {
    echo 'Нет постов для отображения.';
}

Заключение

Подводя итог, рекомендую использовать класс $wpdb или функцию get_posts(), чтобы избежать проблем с безопасностью, производительностью и читабельностью кода. Также не забудьте включить отладку для выявления возможных ошибок. Если у вас возникнут дополнительные вопросы или проблемы, не стесняйтесь обращаться!

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

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