Расширение контекста поиска на экране сообщений списка admin

Я создал собственный тип сообщения и привязал к нему некоторые настраиваемые поля. Теперь я хотел бы, чтобы авторы могли выполнить поиск на экране пользовательских сообщений (в бэкэнде администратора), который также должен выполняться в мета-полях, а не только в заголовке и содержимом, как обычно.

Где я могу подключиться и какой код мне нужно использовать?

Пример изображения введите описание изображения здесь>> </p>

<p> Стефано </p></body></html>

28 голосов | спросил Stefano 11 MarpmFri, 11 Mar 2011 15:09:59 +03002011-03-11T15:09:59+03:0003 2011, 15:09:59

4 ответа


32

Я решил фильтровать запрос, добавив соединение в таблицу postmeta и изменив предложение where. советы по фильтрации предложения WHERE (часто требуют поиска регулярных выражений и замены) здесь, в кодексе

add_filter( 'posts_join', 'segnalazioni_search_join' );
function segnalazioni_search_join ( $join ) {
    global $pagenow, $wpdb;

    // I want the filter only when performing a search on edit page of Custom Post Type named "segnalazioni".
    if ( is_admin() && 'edit.php' === $pagenow && 'segnalazioni' === $_GET['post_type'] && ! empty( $_GET['s'] ) ) {    
        $join .= 'LEFT JOIN ' . $wpdb->postmeta . ' ON ' . $wpdb->posts . '.ID = ' . $wpdb->postmeta . '.post_id ';
    }
    return $join;
}

add_filter( 'posts_where', 'segnalazioni_search_where' );
function segnalazioni_search_where( $where ) {
    global $pagenow, $wpdb;

    // I want the filter only when performing a search on edit page of Custom Post Type named "segnalazioni".
    if ( is_admin() && 'edit.php' === $pagenow && 'segnalazioni' === $_GET['post_type'] && ! empty( $_GET['s'] ) ) {
        $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;
}
ответил Stefano 18 MarpmFri, 18 Mar 2011 12:02:17 +03002011-03-18T12:02:17+03:0012 2011, 12:02:17
7

Ответ Stefano велик, но ему не хватает отдельного предложения:

function segnalazioni_search_distinct( $where ){
    global $pagenow, $wpdb;

    if ( is_admin() && $pagenow=='edit.php' && $_GET['post_type']=='segnalazioni' && $_GET['s'] != '') {
    return "DISTINCT";

    }
    return $where;
}
add_filter( 'posts_distinct', 'segnalazioni_search_distinct' );

Добавьте код, обновляющий его, и он будет работать без дубликатов.

ответил Calara Ionut 30 PMpWed, 30 Apr 2014 16:00:25 +040000Wednesday 2014, 16:00:25
6

Это будет работать,

function custom_search_query( $query ) {
    $custom_fields = array(
        // put all the meta fields you want to search for here
        "rg_first_name",
        "rg_1job_designation"
    );
    $searchterm = $query->query_vars['s'];

    // we have to remove the "s" parameter from the query, because it will prevent the posts from being found
    $query->query_vars['s'] = "";

    if ($searchterm != "") {
        $meta_query = array('relation' => 'OR');
        foreach($custom_fields as $cf) {
            array_push($meta_query, array(
                'key' => $cf,
                'value' => $searchterm,
                'compare' => 'LIKE'
            ));
        }
        $query->set("meta_query", $meta_query);
    };
}
add_filter( "pre_get_posts", "custom_search_query");
ответил Vin_fugen 31 Jpm1000000pmFri, 31 Jan 2014 15:00:33 +040014 2014, 15:00:33
0

Это не поиск, а некоторый «выбор» по разным значениям.

В файле functions-iworks-posts-filter.zip У вас есть пример того, как добавить фильтр для регулярного сообщения с помощью meta_key. Я думаю, что его легко конвертировать.

ответил Marcin 12 MaramSat, 12 Mar 2011 00:03:08 +03002011-03-12T00:03:08+03:0012 2011, 00:03:08

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132