Вопрос или проблема
Я хочу получить несколько постов с категориями и метками. В настоящее время я использую следующий запрос:
$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()
, чтобы избежать проблем с безопасностью, производительностью и читабельностью кода. Также не забудьте включить отладку для выявления возможных ошибок. Если у вас возникнут дополнительные вопросы или проблемы, не стесняйтесь обращаться!