У меня есть серия сообщений, которые упорядочены по значению meta_key. Они также могут быть расположены в порядке меню, если это необходимо.
Почтовые ссылки следующая / предыдущая (порождаемые next_post_link
, previous_post_link
или posts_nav_link
все навигации по хронологии. В то время как я понимаю , это поведение по умолчанию, я не понимаю , как изменить его. Я обнаружил , что он отображает до adjacent_post_link в ссылке-template.php, но тогда это начинает казаться довольно жестко закодированным. Рекомендуется переписать это с нуля, чтобы заменить его, или есть лучшее решение.
custom-post-types
post-meta
sort
next-post-link
previous-post-link
Джоди Уоррен
источник
источник
Ответы:
Понимание внутренних органов
Порядок «сортировки» смежных (следующий / предыдущий) постов на самом деле не является порядком «сортировки». Это отдельный запрос для каждого запроса / страницы, но он сортирует запрос по
post_date
- или родительскому посту, если у вас есть иерархическая публикация в качестве отображаемого в данный момент объекта.Когда вы посмотрите на внутренности
next_post_link()
, то увидите, что это в основном оболочка APIadjacent_post_link()
. Последняя функция вызываетget_adjacent_post()
внутренне с$previous
аргументом / флагом, установленным для полученияbool(true|false)
ссылки на следующую или предыдущую запись.Что фильтровать?
Углубившись в него, вы увидите, что
get_adjacent_post()
ссылка «Источник» имеет несколько хороших фильтров для своего вывода (он же результат запроса): (Имя фильтра / Аргументы)"get_{$adjacent}_post_join"
"get_{$adjacent}_post_where"
"get_{$adjacent}_post_sort"
Таким образом, вы можете многое сделать с этим. Это начинается с фильтрации
WHERE
предложения, а такжеJOIN
таблицы ed иORDER BY
оператора.Результат кэшируется в памяти для текущего запроса, поэтому он не добавляет дополнительных запросов, если вы вызываете эту функцию несколько раз на одной странице.
Автоматическое построение запросов
Как отметил @StephenHarris в комментариях, есть основная функция, которая может пригодиться при построении SQL-запроса:
get_meta_sql()
- Примеры в Кодексе . По сути, эта функция просто используется для построения оператора meta SQL, который используетсяWP_Query
, но вы можете использовать его и в этом случае (или в других). Аргумент, который вы добавляете в него, является массивом, точно таким же, который добавляется кWP_Query
.Возвращаемое значение представляет собой массив:
Так что вы можете использовать
$sql['join']
и$sql['where']
в вашем обратном вызове.Зависимости, которые нужно иметь в виду
В вашем случае проще всего было бы перехватить его в небольшом (mu) плагине или в файле themes.php вашего файла и изменить его в зависимости от
$adjacent = $previous ? 'previous' : 'next';
переменной и$order = $previous ? 'DESC' : 'ASC';
переменной:Фактические имена фильтров
Итак, имена фильтров:
get_previous_post_join
,get_next_post_join
get_previous_post_where
,get_next_post_where
get_previous_post_sort
,get_next_post_sort
Завёрнутый как плагин
... и обратный вызов фильтра будет (например) примерно таким:
источник
get_meta_sql()
$meta_query
это просто массив, который вы передадитеWP_Query
дляmeta_query
аргумента, в: В этом примере:$meta_sql = get_meta_sql( $meta_query, 'post', $wpdb->posts, 'ID');
- это генерируетJOIN
иWHERE
часть запроса, которая должна быть добавлена.Ответ Кайзера удивителен и тщателен, однако простого изменения предложения ORDER BY недостаточно, если вы не
menu_order
соответствуете вашему хронологическому порядку.Я не могу взять кредит на себя, но я нашел следующий код в этой сущности :
Я изменил имена функций для WP.SE.
Если вы измените только предложение ORDER BY, запрос все равно будет искать сообщения, которые больше или меньше текущей даты публикации. Если ваши сообщения не в хронологическом порядке, вы не получите правильный пост.
Это изменяет предложение where для поиска постов, где menu_order больше или меньше, чем menu_order текущего поста, в дополнение к изменению предложения orderby.
Предложение orderby также не должно быть жестко запрограммировано для использования DESC, так как оно должно будет переключаться в зависимости от того, получаете ли вы ссылку на следующий или предыдущий пост.
источник
WHERE
пункт ищет'YYYY-mm-dd HH:mm:ss'
. Если это не выполнено, это не сработает. Поскольку это значение задается не БД, а приложением, вам сначала нужно будет проверить этот формат при построении регулярного выражения.Пытался зацепиться без успеха. Может быть, это просто проблема моей конфигурации, но для тех, кто не может заставить хук работать, вот самое простое решение:
источник
get_previous_post_where
,get_previous_post_join
иget_previous_post_sort
играть хорошо с типами пользовательских почтовых и сложного заказа , который включает в себя мета - ключи, я сдался и использовал это. Благодарность!источник
На основании @Szabolcs Полла ответа Я создал этот вспомогательный класс с методами хелперов , чтобы иметь возможность получить сообщения типа по заказу меню и получить следующий и предыдущий пост по заказу меню , а также. Я дополнительно добавил условия, чтобы проверить, является ли текущий пост первым или последним постом, чтобы получить последний или первый пост соответственно.
Например:
Полный класс:
источник
Я нахожу этот небольшой плагин действительно удобным: http://wordpress.org/plugins/wp-query-powered-adjacent-post-link/
источник
Это сработало для меня:
Взято из: https://stackoverflow.com/questions/16495117/how-to-skip-sure-links-on-adjacent-posts-in-wordpress
источник
Я нашел гораздо более простой способ добиться пост-навигации на основе метаключ, без необходимости изменять functions.php.
Мой пример: у вас есть products.php, и вы хотите переключаться между продуктами. Предыдущий продукт - следующий, более дешевый, следующий - более дорогой.
Вот мое решение для single.php :
источник
query_posts
когда кодекс заявляет, что его не следует использовать.WP_Query
следует использовать как в предыдущих ответах.