Заказ по мета-значению, сначала pro, затем бесплатно
-
-
Добро пожаловать в WPSE.Для начала посетите нашу страницу [тур],чтобы узнать,как работает сайт.Также посетите [справку] по любым вопросам,связанным с сайтом.Чтобы вернуться к вашему вопросу,мне просто нужно устранить некоторые проблемы,вы хотите случайным образом получать сообщения из мета-ключа со значениямиfree иpro в качестве мета.Допустим,вы получаете 10 сообщений,4 профессиональных и 6 бесплатных,сначала должны быть показаны 4 профессиональных сообщения,а затем остальные 6 - бесплатно.Просто совет,не используйте query_posts,лучше используйте WP_Query.Welcome to WPSE. To start you off, please feel free to visit our [tour] page to get a feel on how the site operate. Also visit [help] for any site related questions. To come back to your question, I just need to clear some issues, you want to randomly fetch posts from a meta key with free and pro as meta values. Say you get 10 posts, 4 pro and 6 free, the 4 pro posts must be shown first, then the other 6 free. Just a tip, do not use `query_posts`, rather use `WP_Query`
- 0
- 2014-10-13
- Pieter Goosen
-
k спасибо означает,что я использовал query_posts во встроенной функции.tax-list.php,поэтому мне нужно создать новый файл cat.php?для нового цикла?или использовал wp в том же файле?k thanks means i used query_post in - inbuild function of theme. tax-list.php so i need to create new cat.php file ? for new loop ? or used wp in same file ?
- 0
- 2014-10-13
- itcgpit mark
-
Используйте тот же файл,просто замените query_posts на WP_Query.Также,пожалуйста,посоветуйтесь с моим последним комментарием,пытаетесь ли вы это сделать.Use the same file, just change `query_posts` to `WP_Query`. Also, please advice on my last comment whether this is what you are trying to do
- 0
- 2014-10-13
- Pieter Goosen
-
Я пытаюсь понравиться. на странице списка категорий тип сообщения=листинг мета-значение=pro и бесплатно,но сначала отобразитеpro,затем бесплатно. так что порядок по мета-значениям DESC WP_Query ($ query_string. '& Orderby=meta_value_num'); Вызов неопределенной функции WP_Query () ошибкаya i am trying like. in page of category listing post type = listing meta value = pro and free but first display pro then free .so order by meta value order DESC WP_Query($query_string . '&orderby=meta_value_num'); Call to undefined function WP_Query() error
- 0
- 2014-10-13
- itcgpit mark
-
например,на странице моей категории,если есть 10 сообщений,тогда я хочу 10 со случайным,но сначалаmeta value=pro,затемmeta_value=free.Хорошо . сейчас случайная работа. со всеми или только сообщениями или только бесплатно.но я хочу упростить порядок по мета-значению,чтобы решить эту проблемуfor ex in my category page if there 10 post then i want 10 with random but meta value = pro first then meta_value = free then. ok . right now random working .with all or only post or only free. but i want order by meta value so easy for me to solve this issues
- 0
- 2014-10-13
- itcgpit mark
-
Посетите [`WP_Query`] (http://codex.wordpress.org/Class_Reference/WP_Query#Custom_Field_Parameters),чтобы понять,как работают параметры мета-запроса и как они должны быть построены.Также проверьте параметры заказаPlease visit [`WP_Query`](http://codex.wordpress.org/Class_Reference/WP_Query#Custom_Field_Parameters) to understand how the meta query parameters work and how it should be constructed. Also, check the orderby parameters
- 0
- 2014-10-13
- Pieter Goosen
-
2 ответ
- голосов
-
- 2014-10-13
Прежде чем я начну стрелять,всего одно примечание: НИКОГДА (выделено мной) не используйте
<цитата>query_posts
для создания собственных запросовПримечание. Эта функция не предназначена для использования плагинами или темами. Как объяснено ниже,есть более эффективные и эффективные варианты изменения основного запроса. query_posts () - это слишком упрощенный и проблемный способ изменить основной запрос страницы,заменив его новым экземпляром запроса. Это неэффективно (повторно запускает SQL-запросы) и в некоторых случаях может привести к сбою (особенно часто при работе с разбивкой на страницы).
Вместо этого используйте
WP_Query
илиget_posts
для создания собственных запросов,но ТОЛЬКО если вы не может изменить основной запрос с помощьюpre_get_posts
. Для получения дополнительной информации ознакомьтесь с этим сообщениемПредполагая,что для вашего
meta_key
есть только два значения ( ПОЖАЛУЙСТА,ОБРАТИТЕ ВНИМАНИЕ: для целей тестирования я использовал свой собственный мета-ключ,вы должны заменить его своим собственным ),а именноpro
иfree
,вы можете просто получать сообщения,которые имеют этот конкретныйmeta_key
. Ваш запрос будет выглядеть примерно так:$args = [ 'meta_key' => 'packages', 'orderby' => 'rand', 'posts_per_page' => 5, ]; $the_query = new WP_Query( $args );
Если у вас больше значений,чем только эти два,вам нужно будет настроить свой запрос,включив в него
meta_value
,а затем использовать параметрmeta_compare
. Ваш скорректированный запрос изменится на:$args = [ 'meta_key' => 'packages', 'meta_value' => 'free, pro', 'orderby' => 'rand', 'meta_compare' => 'IN', 'posts_per_page' => 5, ];
( PS! Прежде чем я продолжу,обратите внимание,что параметр
orderby
был изменен в версии 4.0,но в данном случае это не сработает.Отлично,теперь у вас будет 5 сообщений,которые были извлечены случайным образом и имеют либо
meta_value
pro
,либоfree
Теперь нам нужно их отсортировать. Лучшее возможное решение - использовать
usort
для сортировки возвращенного массива сообщений в$the_query->posts
по значению сообщенийmeta_value
. Затем вам нужно будет отключить$the_query->posts
,а затем сбросить его с помощью переупорядоченного массива сообщений.Вот полный код:
<?php $args = [ 'meta_key' => 'packages', 'meta_value' => 'free, pro', 'orderby' => 'rand', 'meta_compare' => 'IN', 'posts_per_page' => 5, ]; $the_query = new WP_Query( $args ); $post_metas = $the_query->posts; usort( $post_metas, function( $a, $b ){ $a = get_post_meta( $a->ID , 'packages', true ) ; $b = get_post_meta( $b->ID, 'packages', true ) ; if ( $a == $b ) { return 0; } return ( $a > $b ) ? -1 : 1; } ); unset($the_query->posts); $the_query->posts = $post_metas; if ( $the_query->have_posts() ) { echo '<ul>'; while ( $the_query->have_posts() ) { $the_query->the_post(); echo '<li>' . get_post_meta( get_the_ID(), 'packages', true ). '</br>' . get_the_title() . '</li>'; } echo '</ul>'; } wp_reset_postdata(); ?>
Вам просто нужно будет настроить переменные запроса в соответствии с вашими потребностями,а также настроить цикл для отображения того,что необходимо
Это не единственный способ добиться этого. Вы также можете переместить свою функцию сортировки в файлfunctions.php и настроить таргетинг на этот пользовательский запрос.
Before I fire away, just one note, NEVER (my emphasis) make use of
query_posts
to create custom queriesNote: This function isn't meant to be used by plugins or themes. As explained later, there are better, more performant options to alter the main query. query_posts() is overly simplistic and problematic way to modify main query of a page by replacing it with new instance of the query. It is inefficient (re-runs SQL queries) and will outright fail in some circumstances (especially often when dealing with posts pagination).
Rather make use of
WP_Query
orget_posts
to create custom queries, but ONLY if you can't modify the main query withpre_get_posts
. For more info, check out this postAssuming that there are only two values for your
meta_key
(PLEASE NOTE: For testing purposes, I have used my own meta key, you should replace this with your own), namelypro
andfree
, you can just retrieve posts that has this specificmeta_key
. Your query will then look something like this:$args = [ 'meta_key' => 'packages', 'orderby' => 'rand', 'posts_per_page' => 5, ]; $the_query = new WP_Query( $args );
If you however have more values than just these two, then you will need to adjust your query to include the
meta_value
and then make use of themeta_compare
parameter. Your adjusted query will then become:$args = [ 'meta_key' => 'packages', 'meta_value' => 'free, pro', 'orderby' => 'rand', 'meta_compare' => 'IN', 'posts_per_page' => 5, ];
(PS! Before I go on, you should note that the
orderby
parameter has changed in version 4.0, but this will not work in this instance.Great, you will now have 5 posts that was retrieved randomly which has either a
meta_value
ofpro
orfree
Now we need to sort them. The best possible solution is to make use of
usort
to sort the returned array of posts in$the_query->posts
according to the value of the postsmeta_value
. You will then need to unset$the_query->posts
and then reset it with the reordered post array.Here is the complete code:
<?php $args = [ 'meta_key' => 'packages', 'meta_value' => 'free, pro', 'orderby' => 'rand', 'meta_compare' => 'IN', 'posts_per_page' => 5, ]; $the_query = new WP_Query( $args ); $post_metas = $the_query->posts; usort( $post_metas, function( $a, $b ){ $a = get_post_meta( $a->ID , 'packages', true ) ; $b = get_post_meta( $b->ID, 'packages', true ) ; if ( $a == $b ) { return 0; } return ( $a > $b ) ? -1 : 1; } ); unset($the_query->posts); $the_query->posts = $post_metas; if ( $the_query->have_posts() ) { echo '<ul>'; while ( $the_query->have_posts() ) { $the_query->the_post(); echo '<li>' . get_post_meta( get_the_ID(), 'packages', true ). '</br>' . get_the_title() . '</li>'; } echo '</ul>'; } wp_reset_postdata(); ?>
You will just need to adjust the query variables to suit your needs and also adjust the loop to display what is needed
This is not the only way to achieve it though, you can also move your sorting function to your functions.php and specifically target this custom query
-
да,я получил профессионал первым,а также случайное спасибо.но теперь его результат отображается как все сообщения .. но я хочу только для категорииperticuler.например,я нажимаю на категорию,и я хочу публикацию только этой категории,спасибо также мой тип сообщения=листингye i got pro first as well as random thanks . but now its display result as all post.. but i want only for perticuler category. like i click on categoryand i want post of only that category thanks also my post type = listing
- 0
- 2014-10-15
- itcgpit mark
-
Просто добавьте 'cat'=>get_queried_object ('cat') -> cat_ID,`к своим аргументамJust add `'cat' => get_queried_object('cat')->cat_ID,` to your arguments
- 0
- 2014-10-15
- Pieter Goosen
-
спасибо,я получил отличный результат в базе данных.когда я передаю выходной sql.теперь мне просто нужно изменить в html означает эхо-часть.asl,но сейчас это про после бесплатного,но я хочу,чтобы это значение было случайным.?. Спасибо мне также нужно внести изменения в HTML или то,что я хочу отображать на странице,спасибоthanks i got perfect output in database. when i pass output sql. now i just need to change in html means echo part. asl but right now its pro after free but i want that value as random .?.thanks i also need to changes in html or what i want to display in page thanks
- 0
- 2014-10-15
- itcgpit mark
-
Рад,что решено.Что касается раздела HTML,это выходит за рамки этого вопроса.Материалы,связанные с HTML,на этом сайте также не по теме.Если вам нужна помощь с html-структурой вашей страницы,вам следует задать новый вопрос на stackoverflow.com,который лучше подходит для вопросов такого типа.СпасибоGlad that is solved. As for the HTML section, that is out of scope of this question. HTML related stuff is also off topic on this site. If you need help with the html structure of your page, you should ask a new question over at stackoverflow.com which is better suited for these type of questions. Thank you
- 0
- 2014-10-15
- Pieter Goosen
-
Большое спасибо,ты спас мне день.У меня есть правильные данные,теперь просто нужно в эхо.название изображения и дес.в соответствии с форматом темы.хорошо,спасибо,сэр :)thanks a lot u saved my day. i got right data now just need in echo. an image title and des. with as per theme formate. ok thanks sir :)
- 0
- 2014-10-15
- itcgpit mark
-
он не будет принимать пост на страницу .. это нарушит нумерацию страниц ... !!it will not take post per page.. this will break pagination in ...!!
- 0
- 2014-10-15
- itcgpit mark
-
- 2014-10-13
Вам необходимо выполнить запрос по
meta_key
вместоmeta_value
:$query_string . '&meta_key=name_of_key_that_stores_free_or_pro&orderby=meta_value_num'
You need to query by the
meta_key
instead ofmeta_value
:$query_string . '&meta_key=name_of_key_that_stores_free_or_pro&orderby=meta_value_num'
-
спасибо за ответ,но он не работает,я использовал query_posts ($ query_string. '&meta_key=J_listing_type & orderby=meta_value_num'); но не работаетthanks for reply but its not working i used query_posts($query_string . '&meta_key=J_listing_type&orderby=meta_value_num'); but not working
- 0
- 2014-10-13
- itcgpit mark
-
Попробуйте просто `orderby=meta_value`Try just `orderby=meta_value`
- 0
- 2014-10-13
- TheDeadMedic
-
Я тоже пробую,но не работает :(i try this also but not working :(
- 0
- 2014-10-13
- itcgpit mark
Я получаю список профи со случайным выбором,но я хочу
pro
,а также бесплатно,но сначала со спискомpro
,а затемmeta_value
free
список.Я также установил
orderby
meta_value
Это не работает,и в строке запроса по умолчанию для
cat
.Будет использоватьсяorderby
date
и дляmeta value = pro
,и дляfree
.Есть предложения?