2013-09-14 2 views
0

У меня есть пользовательский тип сообщения (песни) и несколько настраиваемых полей, связанных с ним. Одним из настраиваемых полей является флажок (sample_playlist), остальные - текстовые строки.Как искать сообщения определенного пользовательского типа сообщений по настраиваемому значению поля, а затем «фильтровать» результаты по значению поля настраиваемого поля?

Я добавил выберите элемент, и я использую значение флажок, чтобы фильтровать результаты, когда на edit.php? Post_type = песни

add_filter('parse_query', array(&$this, 'wpse45436_posts_filter')); 

function wpse45436_posts_filter($query){ 
// current page and post type checks omitted 
    $query->query_vars['meta_key'] = 'sample_playlist'; 
    $query->query_vars['meta_value'] = 'on'; //these are the queries that get executed when filtering the posts that have the custom field checkbox checked 
    } 

Это прекрасно работает, когда я только пытаться фильтровать результаты, основанные на значение флажка.

Поиск других значений настраиваемых полей также возможно на той же странице с помощью

add_filter('posts_join', array(&$this, 'songs_search_join')); 
add_filter('posts_where', array(&$this, 'songs_search_where')); 
function songs_search_join ($join){ 
    // current page, post type and $_GLOBAL['s'] checks omitted  
    $join .='LEFT JOIN '.$wpdb->postmeta. ' ON '. $wpdb->posts . '.ID = ' . $wpdb->postmeta . '.post_id '; 
    return $join; 
} 
function songs_search_where($where){ 
    // current page, post type and $_GLOBAL['s'] checks omitted 
    $where = preg_replace(
     "/\(\s*".$wpdb->posts.".post_title\s+LIKE\s*(\'[^\']+\')\s*\)/", 
     "(".$wpdb->posts.".post_title LIKE $1) OR (".$wpdb->postmeta.".meta_value LIKE $1)", $where 
    ); 
    return $where; 
} 

поиска отлично работает, когда я только пытаюсь искать термины по значениям настраиваемых полей.

ОДНАКО, когда я пытаюсь использовать оба эти последовательно (т. Е. Поиск, затем фильтр, или наоборот), я столкнулся с проблемой с объединением поиска с использованием wp_postmeta, а также с помощью фильтра по значению флажка «настраиваемое поле», используя это также. Есть ли способ обойти это, что позволит мне использовать оба эти последовательно?

ошибка я получаю: Ошибка базы данных WordPress не уникальный стол/псевдоним: 'wp_postmeta'

в результате выхода SQL запросов:

SELECT SQL_CALC_FOUND_ROWS wp_posts.ID FROM wp_posts INNER JOIN wp_postmeta ON (wp_posts.ID = wp_postmeta.post_id)LEFT JOIN wp_postmeta ON wp_posts.ID = wp_postmeta.post_id WHERE 1=1 AND (((wp_posts.post_title LIKE '%searchterm%') OR (wp_postmeta.meta_value LIKE '%searchterm%') OR (wp_posts.post_content LIKE '%searchterm%'))) AND wp_posts.post_type = 'songs' AND (wp_posts.post_status = 'publish' OR wp_posts.post_status = 'future' OR wp_posts.post_status = 'draft' OR wp_posts.post_status = 'pending' OR wp_posts.post_status = 'private') AND ((wp_postmeta.meta_key = 'sample_playlist' AND CAST(wp_postmeta.meta_value AS CHAR) = 'on')) ORDER BY wp_posts.post_date DESC LIMIT 0, 20 

ответ

2

мне нужно использовать псевдоним для $ wpdb-> PostMeta в моем поиске:

add_filter('posts_join', array(&$this, 'songs_search_join')); 
add_filter('posts_where', array(&$this, 'songs_search_where')); 
function songs_search_join ($join){ 
    // current page, post type and $_GLOBAL['s'] checks omitted  
    $join .='LEFT JOIN '.$wpdb->postmeta. ' p ON '. $wpdb->posts . '.ID = p.post_id '; 
    return $join; 
} 
function songs_search_where($where){ 
    // current page, post type and $_GLOBAL['s'] checks omitted 
    $where = preg_replace(
     "/\(\s*".$wpdb->posts.".post_title\s+LIKE\s*(\'[^\']+\')\s*\)/", 
     "(".$wpdb->posts.".post_title LIKE $1) OR (p.meta_value LIKE $1)", $where 
    ); 
    return $where; 
} 
Смежные вопросы