АРМАДА
сортировка постов в WP в рубриках по custom fields numerical
Новая тема Написать ответ Advanced Hosters - профессиональный хостинг

vitvirtual
виртуальный
Зарегистрирован: 11.06.2007
Сообщений: 9061
Contest (Сумма: 1)
Обратиться по нику
# Добавлено:Вс Янв 31, 2010 9:28 amДобавить в избранноеОтветить с цитатой
Возникла проблема: есть плагин для WordPress для сортировки постов в определенных рубриках по значению определенного произвольного поля. Это произвольное поле цифровое. Сортировка происходит в порядке уменьшения , то есть сперва должны отображаться б'ольшие значения, а ниже меньшие.

Вот код плагина:



Код:
<?php

/*
Plugin Name: sort by custom field
Plugin URI:
Description:
Author:
Version:
Author URI:
*/

add_action('pre_get_posts','sort_categories_by_price');

function sort_categories_by_price($x) {
 if(is_category('category1','category2', 'category...')) {
  $x->query_vars['orderby'] = 'meta_value';
  $x->query_vars['order'] = 'DESC';
  $x->query_vars['meta_key'] = 'price';
 }
}
?>



Плагин сортирует, но неправильно, то есть по коду, представленному выше он сортирует так:

800000
750000
600000
3800000
3300000
2800000
2100000
1400000
1150000

а должен сортировать так:

3800000
3300000
2800000
2100000
1400000
1150000
800000
750000
600000

кто-нибудь может подсказать решение проблемы?
www.King-Servers.com - Dedicated Servers от 65$, VDS от 25$

Tomas-R + +
V.I.P.
Зарегистрирован: 07.01.2008
Сообщений: 5567
Обратиться по нику
# Добавлено:Вс Янв 31, 2010 9:41 amОтветить с цитатой
т.е. он сортирует по первой цифре, а не по всему значению
попробуй писать цифры в едином формате кол-ва знаков
рекламная подпись (в PM)

vitvirtual
виртуальный
Зарегистрирован: 11.06.2007
Сообщений: 9061
Contest (Сумма: 1)
Обратиться по нику
# Добавлено:Вс Янв 31, 2010 9:55 amОтветить с цитатой
Tomas-R, так я и пишу в произвольное поле полное число без пробелов, или нужно как-то по-другому?
www.King-Servers.com - Dedicated Servers от 65$, VDS от 25$

Kerk
Профессионал
Зарегистрирован: 30.09.2007
Сообщений: 550
Обратиться по нику
# Добавлено:Вс Янв 31, 2010 3:06 pmОтветить с цитатой
vitvirtual писал(а):
Tomas-R, так я и пишу в произвольное поле полное число без пробелов, или нужно как-то по-другому?



Поле строковое. Потому сортируется как строка, а не число.

3800000
3300000
2800000
2100000
1400000
1150000
0800000
0750000
0600000

Либо попробуй заменить
$x->query_vars['orderby'] = 'meta_value';
на
$x->query_vars['orderby'] = 'lpad(meta_value, 20, \'0\')';
Я — лучший программист, хочу поработать Wink

vitvirtual
виртуальный
Зарегистрирован: 11.06.2007
Сообщений: 9061
Contest (Сумма: 1)
Обратиться по нику
# Добавлено:Вс Янв 31, 2010 7:02 pmОтветить с цитатой
нет, не работает эта конструкция

если поставить с этой конструкцией order = DESC то сортирует так:

600000
1400000
3300000
1150000
750000
2100000

а если поставить order = ASC то так:

1000000
3800000
2800000
800000

и т.д.


Последний раз редактировалось: vitvirtual (Вс Янв 31, 2010 7:12 pm), всего редактировалось 1 раз
www.King-Servers.com - Dedicated Servers от 65$, VDS от 25$

Kerk
Профессионал
Зарегистрирован: 30.09.2007
Сообщений: 550
Обратиться по нику
# Добавлено:Вс Янв 31, 2010 7:07 pmОтветить с цитатой
vitvirtual писал(а):
нет, не работает эта конструкция



А что говорит? Вообще все валится или просто неправильно сортирует?
Мне сейчас негде проверить.
Я — лучший программист, хочу поработать Wink

vitvirtual
виртуальный
Зарегистрирован: 11.06.2007
Сообщений: 9061
Contest (Сумма: 1)
Обратиться по нику
# Добавлено:Вс Янв 31, 2010 7:13 pmОтветить с цитатой
выше подредактировал, как сортирует!
www.King-Servers.com - Dedicated Servers от 65$, VDS от 25$

Taburetkin
Гуру
Зарегистрирован: 25.02.2007
Сообщений: 1426
Star (Сумма: 1)
Обратиться по нику
# Добавлено:Вс Янв 31, 2010 7:27 pmОтветить с цитатой
http://wordpress.org/support/topic/277454

vitvirtual
виртуальный
Зарегистрирован: 11.06.2007
Сообщений: 9061
Contest (Сумма: 1)
Обратиться по нику
# Добавлено:Пн Фев 01, 2010 7:55 amОтветить с цитатой
Taburetkin, спасибо, ты как всегда на высоте :thup:

но в моем проблема еще вот в чем, в программировании я дуб дубом, мне надо "разжевать все и положить в рот"

Вот, что я сделал, я взял и в шаблоне страницы подредактировал строчку:

Код:
query_posts('cat=categoryID&meta_key=price&orderby=meta_value_number&order=DESC&showposts='.$limit.'&paged=' . $paged);



оно так должно работать, я нутром чувствую...

далее в собственный файл WP /wp-includes/query.php после позиции 2240 (У меня WP 2.7 с переводом Лекактуса) добавил строчку:

Код:
if (strpos($orderby,'meta_value') && $q['meta_key'] == 'price') {$orderby = str_replace('meta_value','meta_value+0',$orderby);} else {}



и ведь не работает ни хрена :`( , а Stepasyuk по этой ссылке тему говорит!
www.King-Servers.com - Dedicated Servers от 65$, VDS от 25$

vitvirtual
виртуальный
Зарегистрирован: 11.06.2007
Сообщений: 9061
Contest (Сумма: 1)
Обратиться по нику
# Добавлено:Пн Фев 01, 2010 9:37 pmОтветить с цитатой
В общем решилась проблема таким образом, на меня как будто озарение нашло Smile , плагин я изменил так:

Код:
add_action('pre_get_posts','sort_categories_by_price');

function sort_categories_by_price($x) {
 if(is_category('category1') OR is_category('category2') OR is_category('...')) {
  $x->query_vars['orderby'] = 'meta_value';
  $x->query_vars['order'] = 'DESC';
  $x->query_vars['meta_key'] = 'price';
 }
}
?>



а в файл WP /wp-includes/query.php после позиции 2240 добавил строчку:

Код:
if (strpos($orderby,'meta_value') && $q['meta_key'] == 'price') {$orderby = str_replace('meta_value','meta_value+0',$orderby);}
else {}


И все заработало!

Это работает только в WP 2.7, если у вас более свежая версия WP, то плагин сортировки по цене будет работать, а файл /wp-includes/query.php нужно модифицировать по-другому, так как описано в топике на официальном форуме WP по адресу, который выше указал Taburetkin
www.King-Servers.com - Dedicated Servers от 65$, VDS от 25$
Новая тема Написать ответ    ГЛАВНАЯ ~ ТЕХНИЧЕСКИЕ ВОПРОСЫ

Перейти:  





Генеральный спонсор



Партнеры