Как вывести список статей, упорядоченный по числовому значению произвольного поля WordPress (Создание сайтов: PHP: WordPress)

Задача: В боковой колонке сайта требуется вывести перечень статей, у которых назначена своя собственная рейтинговая шкала (по значению произвольного поля WordPress «meta_key»). При этом нужно, чтобы сообщения были отсортированы по числовому значению этого поля (нужно, чтобы meta_value — было числом)
Ответ
В WordPress есть возможность добавлять любые произвольные поля (meta_key) и использовать затем их значения (meta_value) при оформлении сайта. Но важно то, что по умолчанию в базе данных WordPress тип значения meta_value является LONGTEXT, и без дополнительных усилий мы не можем упорядочить записи по числовому представлению meta_value.
Чтобы заставить MySQL вернуть значение meta_value в виде числа, мы должны исполнить запрос вида: ‘meta_value +0’.
Допустим, мы добавили произвольное поле с названием «rate», при написании статей мы назначаем некоторым своим записям числовые значения этого поля (5, 7, 29, 99 и т.д.) и затем хотим вывести эти статьи, упорядочив их по этому «рейтингу».

Итак, вот наш запрос и его исполнение (этот код можно добавить в файл sidebar.php):

<?php
$querystr = "
SELECT * FROM $wpdb->posts
LEFT JOIN $wpdb->postmeta ON($wpdb->posts.ID = $wpdb->postmeta.post_id)
WHERE $wpdb->posts.post_status = 'publish'
AND $wpdb->postmeta.meta_key = 'rate'
ORDER BY $wpdb->postmeta.meta_value+0";

$pageposts = $wpdb->get_results($querystr, OBJECT);
?>
<?php if ($pageposts): ?>
    <?php global $post; ?>
    <?php foreach ($pageposts as $post): ?>
        <?php setup_postdata($post); ?>

        <div id="post-<?php the_ID(); ?>">
            <table border=0 width=100%><tr><td>
            <a href="<?php the_permalink() ?>" rel="bookmark" title="Permanent Link to <?php the_title(); ?>">
            <?php the_title(); ?></a> - <?php if(function_exists('the_views')) { the_views(); } ?> (r <?php $custom = get_post_custom($post->ID); echo $custom["rate"][0]; ?>)
            </td></tr></table> <br>
        </div>
    <?php endforeach; ?>
<?php else : ?>
<?php endif; ?>

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

Ваш e-mail не будет опубликован. Обязательные поля помечены *

Этот сайт использует Akismet для борьбы со спамом. Узнайте как обрабатываются ваши данные комментариев.