Упорядочить сообщения (по всему сайту) по дате метаданных

8

Моя настраиваемая страница «Домашняя страница» настроена на сортировку моих настраиваемых сообщений с помощью настраиваемого поля даты с этим (обновленным, чтобы иметь произвольное имя) кодом в functions.php:

// sort order for home page
add_action('wp', 'wwgo_check_page');
function wwgo_check_page () {
if (is_page()) {
    add_filter('get_previous_post_sort', 'sort_it');
    add_filter('get_next_post_sort', 'sort_it');
    add_filter('posts_orderby', 'sort_it' );
    add_filter('posts_join', 'join_it' );
    add_filter('posts_where', 'where_it' );

    function sort_it () {
        global $wpdb;

        return " $wpdb->postmeta.meta_value ASC ";
    }

    function join_it( $join ) {
        global $wpdb;

        $join .= " LEFT JOIN $wpdb->postmeta ON($wpdb->posts.ID = $wpdb->postmeta.post_id) ";

      return $join;
    }

    function where_it( $where ) {
        global $wpdb;
        $where .= "AND $wpdb->postmeta.meta_key = 'deadline' ";

      return $where;
    }
}



}

Который денди и простой. Сейчас же. Я хочу, чтобы это работало на всем сайте. Я хочу, чтобы записи на страницах архива, категории и т. Д. Сортировались первыми по настраиваемому полю даты.

Любые идеи?

Я пытался изменить ' if' на, is_archive()но это не имело никакого эффекта. Я <! is_single()>тоже пытался .

Я уверен, что это должно быть что-то простое. Но я новичок в php и, следовательно, невежественен.

Вот сайт , где вы можете видеть, что домашняя страница хорошо отсортирована, но если вы нажмете «поэзия» (единственная с несколькими постами), сортировка не будет работать.

Любые предложения будут встречены с большой радостью.

Спасибо, пожалуйста.

мистифицировать
источник
Вы должны префикс всей вашей функции, например, для. josh_чтобы избежать именования коллизий.
Кайзер
Вы имеете в виду это как хорошую практику или решить эту проблему? Я попытался снова скопировать код для is_archive, и он позволил мне снова вызвать функцию, но сортировка не сработала ...
Джош
1
Да, это хорошая практика. Плюс: Вы не должны заключать функции в функции.
Кайзер
круто, круто (я только что скопировал код с сайта, я новичок в php и wordpress). Любой прогресс в том, как заставить это работать на сайте? У меня он работает с несколькими пользовательскими страницами и той же функцией, установленной на (is_page ()), но все же это ничего не делает для моих архивных страниц. Я понятия не имею, как их исправить ...
Джош
1
Вместо того, чтобы помещать функции в функции, попробуйте вместо этого использовать класс.
Мэнни Флермонд

Ответы:

2

Используйте query_varsили запрос фильтра, чтобы добавить, orderbyесли orderbyне представлен в строке запроса

Максим Крыжановский
источник
+1 за requestпредложение фильтра
Михал Мау
@josh также ознакомьтесь с этим ответом wordpress.stackexchange.com/a/21378/2110, чтобы узнать, как проверять is_archive()и так рано, в процессе.
Михал Мау
Фильтр запроса действительно был, хороший крик.
Джош
0

Почему вы не используете query_posts ()?

<?php
query_posts('meta_key=key_name&orderby=key_name&sort=ASC');
if ( have_posts() ) : while ( have_posts() ) : the_post();

endwhile; else:

endif;

wp_reset_query();

Вы также можете изменить запрос с помощью хука pre_get_posts и выполнить там условную сортировку с помощью is_archive (), is_page () и т. Д.

Брайан Фегтер
источник
0

Я тоже смотрю на ваш другой вопрос .

Если вы хотите отсортировать по мета-значению даты, они, естественно, должны быть в одном и том же формате - я предполагаю, что это PHP-формат даты ('m-y'), который вы указали в своем коде?

Если это так, вы можете обнаружить, что если вы измените свой meta_valueкод, meta_value_numвы получите лучший результат?

Не уверен, что это сработает, но, возможно, стоит попробовать.

DJB
источник