Поиск объявлений с файлами, картинки и др

Задача найти объявления у которых загружен файл № 0 (первый), более конкретнее на сайте виртуальные туры 3D была поставлена задача искать виртуальные туры у которых загружен 3d флеш тур. 3D тур этот файл идет под номером 0 самым первым то есть.
Для начала нам надо модернизировать виджет поиска который идет в комплекте с плагином открываем файл ads_widgets.php, здесь мы ничего менять не будем просто копируем код виджета и вставляем этот код в ads_config.php, меняем Ads_Search_Form на свое название например Ads_3d_Search сохраняем код. Открываем админку WP у нас должен появится новый виджет Ads_3d_Search, добавляем этот виджет в сайд бар, теперь можно спокойно работать с новым виджетом дабы не трогать оригинальные файлы плагина. В новом виджете я немного изменил порядок полей поиска и добавил новый чекбокс только 3d:
окончательный код виджета:

class Ads_3d_Search extends WP_Widget { function Ads_3d_Search() { // widget actual processes parent::WP_Widget(false, $name = ‘Ads_3d_Search’); } function widget($args, $instance){ if( !class_exists(‘HTML_FormPersister’) ) include_once WP_PLUGIN_DIR.’/ads-wordpress/FormPersister.php’; global $ads_options; // создаем выпад список категорий $ads_base_category = slug_to_term_id($ads_options[‘ads_base_category’],’category’); $select_rub = wp_dropdown_categories( array(‘child_of’ =>$ads_base_category, ‘hide_empty’ => 0, ‘hierarchical’ => 1, ‘name’=>’category__and[]’,’echo’=>0) ); $select_rub = preg_replace(‘~<select[^>]+>~’, ‘<option class=»level-0″ value=»»>——</option>’, $select_rub); // select ГЕО категорий $ads_location_root = slug_to_term_id($ads_options[‘ads_location_root’],’category’); $select_loc = wp_dropdown_categories( array(‘child_of’ =>$ads_location_root, ‘hide_empty’ => 0, ‘hierarchical’ => 1, ‘name’=>’category__and[]’,’echo’=>0) ); $select_loc = preg_replace(‘~<select[^>]+>~’, ‘<option class=»level-0″ value=»»>——</option>’,$select_loc); ob_start(); ?><!—create the searchfield—> <form class=»ads_search» method=»get» id=»searchform» name=»searchform» action=»<?php bloginfo(‘home’)?>»> <?php _e(‘Search for text’, ‘ads-wordpress’)?>:<br /> <input type=»text» value=»<?=wp_specialchars($_REQUEST[‘s’], 1) ?>» name=»s» id=»s» /><br /> <?php _e(‘Category’, ‘ads-wordpress’)?>:<br /> <?=$select_rub; ?><br /> <?php _e(‘Area’, ‘ads-wordpress’)?>:<br /> <?=$select_loc; ?><br /> <?php _e(‘Price’, ‘ads-wordpress’)?>:<br /> <input type=»text» name=»ads_price[between][0]» size=»3″ /> — <input type=»text» name=»ads_price[between][1]» size=»3″ /> <select style=»width: 3em» name=»ads_order[ads_price]» size=»1″> <option value=»»><?php _e(‘——‘, ‘ads-wordpress’)?></option> <option value=»iasc»><?php _e(‘increase’, ‘ads-wordpress’)?></option> <option value=»idesc»><?php _e(‘decrease’, ‘ads-wordpress’)?></option> </select> <br /> <?php _e(‘Time’, ‘ads-wordpress’)?>:<br /> <select name=»post_date[dmoe]» size=»1″> <option value=»»><?php _e(‘——‘, ‘ads-wordpress’)?></option> <option value=»<?=date(‘Y-m-d’, strtotime («-1 day»))?>»><?php _e(‘per day’, ‘ads-wordpress’)?></option> <option value=»<?=date(‘Y-m-d’, strtotime («-3 day»))?>»><?php _e(‘3 days’, ‘ads-wordpress’)?></option> <option value=»<?=date(‘Y-m-d’, strtotime («-7 day»))?>»><?php _e(‘last 7 days’, ‘ads-wordpress’)?></option> <option value=»<?=date(‘Y-m-d’, strtotime («-1 month»))?>»><?php _e(‘per month’, ‘ads-wordpress’)?></option> </select><br /> только 3d: <input type=»checkbox» name=»only_3d» /> <br /> <div align=»center»><input type=»submit» value=»<?php _e(‘Search’, ‘ads-wordpress’)?>» /></div> </form> <? $se_form = ob_get_contents(); ob_end_clean(); $ppb = new HTML_FormPersister(); $st = $ppb->process($se_form); echo $st; } // ebd function widget } // end widget Ads_3d_Search add_action(‘widgets_init’, create_function(», ‘return register_widget(«Ads_3d_Search»);’));

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879 class Ads_3d_Search extends WP_Widget { function Ads_3d_Search() { // widget actual processes parent::WP_Widget(false, $name = ‘Ads_3d_Search’); } function widget($args, $instance){    if( !class_exists(‘HTML_FormPersister’) )        include_once WP_PLUGIN_DIR.‘/ads-wordpress/FormPersister.php’;   global $ads_options;// создаем выпад список категорий$ads_base_category = slug_to_term_id($ads_options[‘ads_base_category’],‘category’); $select_rub = wp_dropdown_categories(        array(‘child_of’ =>$ads_base_category,            ‘hide_empty’ => 0, ‘hierarchical’ => 1,            ‘name’=>‘category__and[]’,‘echo’=>0)        );$select_rub = preg_replace(‘~<select[^>]+>~’,    ‘<option class=»level-0″  value=»»>——</option>’, $select_rub);// select ГЕО категорий$ads_location_root = slug_to_term_id($ads_options[‘ads_location_root’],‘category’); $select_loc = wp_dropdown_categories(    array(‘child_of’ =>$ads_location_root,        ‘hide_empty’ => 0, ‘hierarchical’ => 1,        ‘name’=>‘category__and[]’,‘echo’=>0)    );$select_loc = preg_replace(‘~<select[^>]+>~’,    ‘<option class=»level-0″  value=»»>——</option>’,$select_loc); ob_start();?><!create the searchfield><form  class=«ads_search» method=«get» id=«searchform» name=«searchform» action=«<?php bloginfo(‘home’)?>«><?php _e(‘Search for text’, ‘ads-wordpress’)?>:<br /><input type=«text» value=«<?=wp_specialchars($_REQUEST[‘s’], 1) ?>« name=«s» id=«s»  /><br /><?php _e(‘Category’, ‘ads-wordpress’)?>:<br /><?=$select_rub; ?><br /><?php _e(‘Area’, ‘ads-wordpress’)?>:<br /><?=$select_loc; ?><br /> <?php _e(‘Price’, ‘ads-wordpress’)?>:<br /><input type=«text» name=«ads_price[between][0]» size=«3» /> <input type=«text» name=«ads_price[between][1]» size=«3» /><select style=«width: 3em» name=«ads_order[ads_price]» size=«1»><option value=«»><?php _e(‘——‘, ‘ads-wordpress’)?></option><option value=«iasc»><?php _e(‘increase’, ‘ads-wordpress’)?></option><option value=«idesc»><?php _e(‘decrease’, ‘ads-wordpress’)?></option></select> <br /><?php _e(‘Time’, ‘ads-wordpress’)?>:<br /><select name=«post_date[dmoe]» size=«1»><option value=«»><?php _e(‘——‘, ‘ads-wordpress’)?></option><option value=«<?=date(‘Y-m-d’, strtotime («-1 day»))?>«><?php _e(‘per day’, ‘ads-wordpress’)?></option><option value=«<?=date(‘Y-m-d’, strtotime («-3 day»))?>«><?php _e(‘3 days’, ‘ads-wordpress’)?></option><option value=«<?=date(‘Y-m-d’, strtotime («-7 day»))?>«><?php _e(‘last 7 days’, ‘ads-wordpress’)?></option><option value=«<?=date(‘Y-m-d’, strtotime («-1 month»))?>«><?php _e(‘per month’, ‘ads-wordpress’)?></option></select><br /> только 3d: <input type=«checkbox» name=«only_3d» />  <br />   <div align=«center»><input type=«submit»  value=«<?php _e(‘Search’, ‘ads-wordpress’)?>« /></div> </form><?$se_form = ob_get_contents();ob_end_clean();$ppb = new HTML_FormPersister();$st = $ppb->process($se_form);echo $st;} // ebd function   widget} // end widget Ads_3d_Search add_action(‘widgets_init’, create_function(», ‘return register_widget(«Ads_3d_Search»);’));

Пол дела уже сделано, теперь надо научить WP обрабатывать переменную only_3d, для этого нам придется копнуть поглубже и воcпользоваться api WordPRess.
Мы подключим свой фильтр который будет изменять основной SQL запрос к БД. Фильтр этот называться posts_request.
НЕ буду утомлять сложностями SQL приведу готовый код который надо также воткнуть в файл ads_config.php:

function ads_3d_search($query){ global $wpdb; if($_REQUEST[‘only_3d’]){ $query = str_replace(‘FROM’, «, image.ID AS image FROM n», $query); $query = str_replace(‘WHERE’, «INNER JOIN $wpdb->posts image ON ($wpdb->posts.ID = image.post_parent) n WHERE», $query); $query = str_replace(‘WHERE 1=1 ‘, «WHERE 1=1 AND image.menu_order = 0 AND image.post_mime_type like ‘image%’ » , $query); } return $query; } add_filter(‘posts_request’, ‘ads_3d_search’,200,1);

12345678910 function ads_3d_search($query){    global  $wpdb;    if($_REQUEST[‘only_3d’]){        $query = str_replace(‘FROM’, «, image.ID  AS image FROM n»,  $query);        $query = str_replace(‘WHERE’, «INNER JOIN $wpdb->posts image ON ($wpdb->posts.ID = image.post_parent) n WHERE»,  $query);        $query = str_replace(‘WHERE 1=1 ‘, «WHERE 1=1  AND image.menu_order = 0 AND image.post_mime_type like ‘image%’ « , $query);    }    return $query;}add_filter(‘posts_request’, ‘ads_3d_search’,200,1);

Вот теперь у нас будут файлы у которых загружен файл с номером 0 порядковым (первый) и у тип (mime type) файлов должен быть image пример только 3D туры.

Если нам надо искать записи у которых загружен не первый файл, а второй то меняем AND image.menu_order = 1.
Если тип файла не картинка, а что-то другое скажем там видео файл меняем AND image.post_mime_type like ‘video%’, если проверка типа файла не нужна то просто удалить условие AND image.post_mime_type like ‘image%’

SQL код который мы получаем на выходе фильтра:

SELECT SQL_CALC_FOUND_ROWS wp_posts.* , image.ID AS image FROM wp_posts INNER JOIN wp_posts image ON (wp_posts.ID = image.post_parent) WHERE 1=1 AND image.menu_order = 0 AND image.post_mime_type like ‘image%’ AND wp_posts.post_type = ‘post’ AND (wp_posts.post_status = ‘publish’ OR wp_posts.post_status = ‘private’) ORDER BY wp_posts.post_date DESC LIMIT 0, 10

123456 SELECT SQL_CALC_FOUND_ROWS  wp_posts.* , image.ID  AS imageFROM wp_posts  INNER JOIN wp_posts image ON (wp_posts.ID = image.post_parent)WHERE 1=1  AND image.menu_order = 0 AND image.post_mime_type like ‘image%’             AND wp_posts.post_type = ‘post’            AND (wp_posts.post_status = ‘publish’ OR wp_posts.post_status = ‘private’)  ORDER BY wp_posts.post_date DESC LIMIT 0, 10