поиск и фильтрация по запросам и нуждам…. как правильнее сделать?

простой поиск и расширенный поиск в этом деле мне не помогают. А хочеться мне вот это:

[quote]У меня есть например категории — Парни, Девочки, Дети итд… Во всех этих категориях есть данные т.е посты… Мне нужно чтоб по категории Девочки на число 28.05.2008 вывел все посты (только не путем стандартного календаря, а дроп меню и поля). Или же на под категорию категории Дети на число 25.05.2008 вывести все посты. Или же по категории Парни на период с 28.05.2008 по 08.06.2008 вывести все посты.[/quote]
как все это огранизовать?

Делаешь форму из кучи дроп-даунов, страницу-обработчик формочки, а в ней свой SELECT wp_posts.* FROM wp_posts JOIN фа-фа WHERE ля-ля AND туда-сюда.

Делаешь форму из кучи дроп-даунов, страницу-обработчик формочки, а в ней свой SELECT wp_posts.* FROM wp_posts JOIN фа-фа WHERE ля-ля AND туда-сюда.

[quote]а плагин вроде для всего этого есть?….. если тебе не трудно дай пожалуйста пример запроса на период — по категории Парни на период с 28.05.2008 по 08.06.2008 вывести все посты.[/quote]
каким должен быть запрос?

$posts = $wpdb->_results("SELECT $wpdb->posts.* FROM $wpdb->posts INNER JOIN $wpdb->term_relationships ON ($wpdb->posts.ID = $wpdb->term_relationships.object_id) INNER JOIN $wpdb->term_taxonomy ON ($wpdb->term_relationships.term_taxonomy_id = $wpdb->term_taxonomy.term_taxonomy_id) WHERE $wpdb->term_taxonomy.taxonomy = ‘category’ AND post_type = ‘post’ AND post_status = ‘publish’
AND $wpdb->term_taxonomy.term_id = ‘123’ AND post_date > ‘2008-5-28’ AND post_date < ‘2008-6-8’");

123 – Парни.

А дальше как обычно
foreach ($posts as $post) { echo $post->post_title; ….. }

спасибо….. применю….

[quote]Ю.Б., у меня вп 2.3.3 ….. мне нужен SQL запрос сделать так, чтоб мог просмотреть данные категории Парни на число 12.05.2008 (т.е. 12.05.2008 какие посты были введены в категорию Парни)…..[/quote]
как правильно это сделать??? После того как будет правильный SQL запрос затем я создам дроп лист категорий и поле для введения даты. Нажав на сабмит люди смогут найти по дате и по категории посты.

Мне просто нужно понять ключевой момент SQL запроса!!!! Как правильно должен быть запрос?

$posts = $wpdb->_results("SELECT $wpdb->posts.* FROM $wpdb->posts INNER JOIN $wpdb->term_relationships ON ($wpdb->posts.ID = $wpdb->term_relationships.object_id) INNER JOIN $wpdb->term_taxonomy ON ($wpdb->term_relationships.term_taxonomy_id = $wpdb->term_taxonomy.term_taxonomy_id) WHERE $wpdb->term_taxonomy.taxonomy = 'category' AND post_type = 'post' AND post_status = 'publish'
AND $wpdb->term_taxonomy.term_id = '123' AND post_date > '2008-5-28' AND post_date < '2008-6-8'");

123 - Парни.

А дальше как обычно 
foreach ($posts as $post) { echo $post->post_title; ..... }

я так понял должно было бы быть вот так $wpdb->_results === $wpdb->get_results …. я все проверил…. но вот те посты что есть он выдает… а потом начинает выдовать пустые посты…… как это понять?? ты протестировал это сам???

где же ты Ю.Б.???

Где-где, работаю, шоб ему. RSS на этом форуме никудышний, за всем не у следишь.
Правильно ты понял, $wpdb->get_results.
Нигде я это не тестировал, сочинил на основе другого запроса, проверенного.

Где-где, работаю, шоб ему. RSS на этом форуме никудышний, за всем не у следишь.
Правильно ты понял, $wpdb->get_results.
Нигде я это не тестировал, сочинил на основе другого запроса, проверенного.

не пошел этот запрос….. я проверил (((

и как назло еще нужно вот такого типа запроса…

нужен SQL запрос сделать так, чтоб мог просмотреть данные категории Парни на число 12.05.2008

.. что делать???

Сейчас попробую…

WP 2.3.3 Шаблон:

<?php
/*
Template Name: template-1
*/
?>
<?php
get_header();
?>

<?php 

echo $query = "SELECT $wpdb->posts.* FROM $wpdb->posts INNER JOIN $wpdb->term_relationships ON ($wpdb->posts.ID = $wpdb->term_relationships.object_id) INNER JOIN $wpdb->term_taxonomy ON ($wpdb->term_relationships.term_taxonomy_id = $wpdb->term_taxonomy.term_taxonomy_id) WHERE $wpdb->term_taxonomy.taxonomy = 'category' AND post_type = 'post' AND post_status = 'publish' AND $wpdb->term_taxonomy.term_id = '3' AND post_date like '2008-03-08%'";
$posts = $wpdb->get_results($query);
foreach ($posts as $post) echo '<h2>'.$post->post_title.'<h2>';
?>

<?php get_footer(); ?>

Результат:

в твоем примере все классно…… вот только есть маленькая ошибочка))).. явно ты загружен и я тут со своими проблемами на тебя иду……

с датой у тебя была ошибочка… а так все классссс!!!! должно было бы быть AND post_date like ‘2008-08-03%’ а было вот такAND post_date like ‘2008-03-08%’
[quote]echo $query = "SELECT $wpdb->posts.* FROM $wpdb->posts INNER JOIN $wpdb->term_relationships ON ($wpdb->posts.ID = $wpdb->term_relationships.object_id) INNER JOIN $wpdb->term_taxonomy ON ($wpdb->term_relationships.term_taxonomy_id = $wpdb->term_taxonomy.term_taxonomy_id) WHERE $wpdb->term_taxonomy.taxonomy = ‘category’ AND post_type = ‘post’ AND post_status = ‘publish’ AND $wpdb->term_taxonomy.term_id = ‘3’ AND post_date like ‘2008-08-03%’";[/quote]
[quote]……. а вот как модернизировать этот запрос чтоб вывел и период постов от 2008-05-03 до 2008-06-03????[/quote]
буду очень благодарен!!!!!

прав ли я если я скажу, что за период можно написать такой запрос:

SELECT wp_posts . *
FROM wp_posts
INNER JOIN wp_term_relationships ON ( wp_posts.ID = wp_term_relationships.object_id )
INNER JOIN wp_term_taxonomy ON ( wp_term_relationships.term_taxonomy_id = wp_term_taxonomy.term_taxonomy_id )
WHERE wp_term_taxonomy.taxonomy = 'category'
AND post_type = 'post'
AND post_status = 'publish'
AND wp_term_taxonomy.term_id = '41'
AND post_date > '2008-05-26'
AND post_date < '2008-06-04'
LIMIT 0 , 30

но вот почему в запросе когда я пишу

AND post_date > '2008-05-26'
AND post_date < '2008-06-03'

он мне выводит посты между 2008-05-26 — 2008-06-02 ????…. что-то тут не так Ю.Б.?

должно было бы быть AND post_date like '2008-08-03%' а было вот такAND post_date like '2008-03-08%'

Кому должно? Я выводил посты за 8 марта 2008 (2008-03-08). За 3 августа 2008 (2008-08-03) в базе ничего нет.

он мне выводит посты между 2008-05-26 --- 2008-06-02 ????

Потому что датавремя любого поста за 3 июня БОЛЬШЕ ‘2008-06-03’ (читай ‘2008-06-03 00:00:00’)

Ю.Б. за дату извини,….. недопонял тебя))))))

ты хочешь сказать что я должен написать максимальное время на 3 июня даже учитывая время????

2008-06-03 23:59:59????

А ты догадливый! 🙂 post_date имеет тип ‘datetime’. Впрочем, с типом ‘date’ оператор "меньше" сработал бы так же. 🙂

БОЛЬШОЕ ТЕБЕ СПАСИБО!!!!:D;)

Как любил говорить один мой знакомый, отработаешь на огороде. 🙂

Ю.Б., нужна еще одна помощь — думаю последняя …. отработаю в огороде как надо))))😀

думаю надо немного модифицировать наш последний запрос так чтоб было что-то вроде:

[quote]некоторые посты присвоены к категориям Парни, Старший, 25-30 лет (т.е. один пост относиться к трем категориям)…. Надо написать запрос так, чтоб можно было бы найти именно те посты которые относятся к категориям Парни, Старший, 25-30 лет[/quote]
Как это сделать грамотно????

как тут быть??? ….. это такой тонкий момент что боюсь что-то испортить в запросах.

Подумаю. Получится – отвечу. Если смогу. У нас тут под окном из телефонного колодца вода фонтанирует, так что может мой инет смыть к чертям собачим.

надеюсь никаких проблем не будет…. осталось совсем ничего……прям все проблемы меня и ждали

Постарайся прошу тебя……
я уже замаялся этими запросами….. скоро я буду ас в этих таксономи)))))

На тебе идеи http://boren.nu/archives/2007/10/01/taxonomy-intersections-and-unions/

На тебе идеи http://boren.nu/archives/2007/10/01/taxonomy-intersections-and-unions/

классная ссылка…. прочел!!!!… но вот мне как назло это дело надо сделать не с тегами а с категориями….. и как назло без запросов не обойтись!!!

в той ссылке что ты дал — как понять этот момент

[quote]# category__in – Accepts an array of category IDs. Fetches posts in any one of the specified categories.
# category__not_in – Accepts an array of category IDs. Fetches posts that are not in any of the specified categories.
# category__and – Accepts an array of category IDs. Fetches posts that are in all of the specified categories.[/quote]
куда это все вписывать и как получить результат??? $wp->set_query_var() — и что???

А я по чем знаю? Небось что-то типа $wp->set_query_var(‘category__and’)=array(‘1′,’2′,’3’); А куда это – хз. Пробуй.

А я по чем знаю? Небось что-то типа $wp->set_query_var('category__and')=array('1','2','3'); А куда это - хз. Пробуй.

мне нравиться ход твоих мыслей))) :lol::D Я понимаю что ты устал, но без запроса тут не обойтись….. 😉

слушай я тут покопался и вот до чего дошел

[quote]это просто классная штучка!!!!![/quote]

<?php query_posts(array('category__and'=>array(26,29))); ?>  -- тут может быть сколь угодно категорий!!!!

ребята таксономи просто клас!!!!!

но вот если бы еще он мог работать с датами было бы фул!!!!

КОДЕКС НАДО ЧТИТЬ. Открываем любимую страницу http://codex.wordpress.org/Template_Tags/query_posts и видим

At 2.3 this combination will return posts belong to both Category 1 AND 3, showing just two (2) posts, in descending order by the title:
query_posts(array('category__and'=>array(1,3),'showposts'=>2,'orderby'=>title,'order'=>DESC));

И нехрен изобретать велосипеды. 😀

Блин, пока искал да копировал, ты и сам то же самое нашел. Круто!

С датами – то такэ. А вот если бы прямо из урла можно было такое же звать, так же как сделали с тегам, было бы совсем файно.

а вот и запрос на категории с датами….

SELECT DISTINCT wp_posts.* FROM wp_posts
LEFT JOIN wp_term_relationships ON (wp_posts.ID = wp_term_relationships.object_id)
LEFT JOIN wp_term_taxonomy ON (wp_term_relationships.term_taxonomy_id = wp_term_taxonomy.term_taxonomy_id)
WHERE wp_posts.post_status = 'publish'
AND wp_term_taxonomy.taxonomy = 'category'
AND wp_term_taxonomy.term_id IN (26, 29) AND post_date > '2008-05-26 09:00:00' AND post_date < '2008-06-03 23:00:00'
ORDER BY post_date DESC

категорий может быть сколь угодно!!!! ….

столько всего сделал чтоб все это найти!!!!……. огромное тебе спасибо!!!!….. наш этот топик бесценен!!!

наш этот топик бесценен!!! 

…для тех кто понимает 😀

сюда глянет только тот кто понимает!!!!! 😉

кстати тем кому интересно.... эти запросы работают на ВП 2.3 и выше (2.5 , 2.5.1 , итд) :)

тут есть один момент: (хотел проверить и сравнить наш SQL запрос с query_posts и увидел вот что)

написав код запроса:

[quote]query_posts(array(‘category__and’=>array(29,120),’showposts’=>5, ‘paged’=>$paged));

я получаю 7 подходящих постов (это так и есть — это правильно)[/quote]
а затем написав такой запрос(который должен быть идентичный верхнему):

$query = "SELECT DISTINCT wp_posts.* FROM wp_posts
LEFT JOIN wp_term_relationships ON (wp_posts.ID = wp_term_relationships.object_id)
LEFT JOIN wp_term_taxonomy ON (wp_term_relationships.term_taxonomy_id = wp_term_taxonomy.term_taxonomy_id)
WHERE wp_posts.post_status = 'publish'
AND wp_term_taxonomy.taxonomy = 'category'
AND wp_term_taxonomy.term_id IN (29, 120) "

$posts = $wpdb->get_results($query);

я не получаю 7 постов…. а получаю намного больше…. почти все мои посты …и тот запрос который нужен не выполняется корректно.

что тут не так??? неужели сам запрос написан не так??? нужно чтоб выводимые посты совпадали не зависимо от метода SQL запроса или же query_posts

Что не так? Посмотри.
В wp-config.php добавляешь строку
define(‘SAVEQUERIES’, true);
В шаблон, в самый конец:
<pre><? print_r($GLOBALS[‘wpdb’]->queries); ?></pre>
и увидишь все запросы, время их выполнения и какая функция вызвала запрос.

Что не так? Посмотри.
В wp-config.php добавляешь строку
define('SAVEQUERIES', true);
В шаблон, в самый конец:
<pre><? print_r($GLOBALS['wpdb']->queries); ?></pre>
и увидишь все запросы, время их выполнения и какая функция вызвала запрос.

я сделал как ты сказал….. но запросов не вижу……

при исполнении этого кода

query_posts(array('category__and'=>array(29,120),'showposts'=>5, 'paged'=>$paged));

я должен буду увидеть SQL код??? но я приписав в конфиг файл define(‘SAVEQUERIES’, true); и в индекс файл после луп я вставил <pre><? print_r($GLOBALS[‘wpdb’]->queries); ?></pre> … и ничего!!!!

если у тебя что-то показывает напиши сюда плиз…… или скажи что я не так сделал

Странно.

Твоя строка в index.php породила:
SELECT p.ID FROM wp_posts p INNER JOIN wp_term_relationships tr ON (p.ID = tr.object_id) INNER JOIN wp_term_taxonomy tt ON (tr.term_taxonomy_id = tt.term_taxonomy_id) INNER JOIN wp_terms t ON (tt.term_id = t.term_id) WHERE tt.taxonomy = ‘category’ AND t.term_id IN (’29’, ‘120’) GROUP BY p.ID HAVING count(p.ID) = 2

А ты куда поставил define? Случайно не после require_once?

Странно.
http://keep4u.ru/imgs/s/080617/8d/8d22f761de2877b3e2.jpg

Твоя строка в index.php породила:
SELECT p.ID FROM wp_posts p INNER JOIN wp_term_relationships tr ON (p.ID = tr.object_id) INNER JOIN wp_term_taxonomy tt ON (tr.term_taxonomy_id = tt.term_taxonomy_id) INNER JOIN wp_terms t ON (tt.term_id = t.term_id) WHERE tt.taxonomy = 'category' AND t.term_id IN ('29', '120') GROUP BY p.ID HAVING count(p.ID) = 2

А ты куда поставил define? Случайно не после require_once?

шас и у меня показало…… как его превратить в нормальный запрос что все было ок?!

Кого во что превратить? Если так работает, какой ОК тебе еще нужен?

Кого во что превратить? Если так работает, какой ОК тебе еще нужен?

этот запрос не выводит посты а только p.ID…… а надо чтоб запрос был нормального вида… вот так как то..

SELECT DISTINCT wp_posts.* FROM wp_posts
LEFT JOIN wp_term_relationships ON (wp_posts.ID = wp_term_relationships.object_id)
....................................

Не тормози, сделай милость. SELECT p.* …

А ты не задумывался, почему они сделали именно так? Может это всё не просто так?

Не тормози, сделай милость. SELECT p.* ... 

А ты не задумывался, почему они сделали именно так? Может это всё не просто так?

да ты прав я сделал звездочку и все пошло…… но опять есть НО 😉 …. но после того как выводит для меня все 7 нужных и правильных постов … дальше начинает выводить пустые посты….. от чего это???

кстати тут опять есть проблема с переходом на 2-ую страницу…….. столько проблем с такими запросами… ужас……. как тут быть???

Так может поэтому они сначала полный список получают, а потом выбирают из него N записей для страницы?
Попробуй использовать LIMIT M, N

Так может поэтому они сначала полный список получают, а потом выбирают из него N записей для страницы?
Попробуй использовать LIMIT M, N

это я уже пробовал…. не идет….. все равно идут пустые посты!!!

шас мой запрос выглядет вот так:

 $query="SELECT p.* FROM wp_posts p INNER JOIN wp_term_relationships tr ON (p.ID = tr.object_id) INNER JOIN wp_term_taxonomy tt ON (tr.term_taxonomy_id = tt.term_taxonomy_id) INNER JOIN wp_terms t ON (tt.term_id = t.term_id) WHERE tt.taxonomy = 'category' AND t.term_id IN ('29', '120') GROUP BY p.ID HAVING count(p.ID) = 2";            

$posts = $wpdb->get_results($query); 

мне эти пусты посты уже надоели… как не напишу не уходят …..

А мне как надоели… 😀 Ты бы запросы через phpmyadmin проверял, оно вроде как и быстрее, и проще править.

А мне как надоели... :D Ты бы запросы через phpmyadmin проверял, оно вроде как и быстрее, и проще править.

ну конечно же я и через phpmyadmin тоже работаю….. там пустых постов нету… 7 постов выводятся… как надо…… а вот в ВП после 7 постов выводятся много пустых постов!!!

ценный топик )) благодарю )

Anonymous
Отправить
Ответ на: