Mostrar postagem correspondente ao termo de pesquisa exato

A idéia é mostrar imediatamente o post correspondente ao termo de pesquisa. O termo de pesquisa será alfanumérico e exclusivo para cada publicação (definido como título). Poderia replace a pesquisa no conteúdo (para o desempenho), eu só preciso do título.

A busca será fornecida através de um leitor de código de barras, por isso será único e preciso.

Estou tentando exibir imediatamente a publicação, não a página de resultados da pesquisa, mas não consigo entender como.

Solutions Collecting From Web of "Mostrar postagem correspondente ao termo de pesquisa exato"

Aqui está uma solução que eu criei que usa um campo oculto no formulário de pesquisa que depois verificaremos nossos filtros para modificar o comportamento padrão de busca / redirecionamento do WP.

Este é o formulário de pesquisa que usei. Observe a adição do barcode-reader campo oculto com um valor de 1 . Eu adicionei o formulário de pesquisa a um modelo de página para fins de teste e demonstração.

  

( Não é claro a partir da publicação original, mas da pesquisa que fiz, deve ser possível que o leitor de código de barras envie um parâmetro por $_GET que poderia ser usado em vez do campo oculto que eu usei para testar.)

Aqui, verificamos se esta pesquisa está sendo realizada pelo scanner de código de barras usando a function helper wpse_is_barcode_search() . A function auxiliar é usada para que não possamos duplicar a lógica nos múltiplos ganchos que são usados ​​nesta implementação.

Se estamos fazendo uma pesquisa usando o scanner, posts_search nosso filtro posts_search e fazemos algumas modificações na instância WP_Query antes da consulta ser realizada.

 /** * Wire up our posts_search filter and change the $query. * * @param WP_Query $query The WP_Query instance (passed by reference). */ add_action( 'pre_get_posts', 'wpse_barcode_search_pre_get_posts' ); function wpse_barcode_search_pre_get_posts( $query ) { // Bail if this search is not performed by the barcode scanner. if ( ! wpse_is_barcode_search( $query ) ) { return; } // Wire up the filter to modify the search SQL. add_filter( 'posts_search', 'wpse_barcode_posts_search', 10, 2 ); // Set posts_per_page to one since we're only looking for an exact match anyway. $query->set( 'posts_per_page', 1 ); // (suggestion) Limit search to a particular post type. // $query->set( 'post_type', array( 'product', ) ); } 

Aqui está o filtro que realmente modifica o SQL de pesquisa. Uma vez que só queremos que isso dispare uma vez, o filtro será imediatamente exibido.

 /** * Modify search query so that the search term looks for an exact * match with the post title. * * @param string $search Search SQL for WHERE clause. * @param WP_Query $wp_query The current WP_Query object. */ function wpse_barcode_posts_search( $search, $wp_query ) { // We only want the search filter to fire once, so unhook it. remove_filter( 'posts_search', 'wpse_barcode_posts_search', 10, 2 ); // Change the search SQL so that it checks if the search is equal to the post title. $search = " AND (wp_posts.post_title = '" . esc_sql( $wp_query->query_vars['s'] ) . "')"; return $search; } 

Este código redireciona o usuário para o link permanente da nossa publicação encontrada em vez da página de resultados da pesquisa.

 /** * Redirect to the permalink of the searched item if it was found using * the barcode search. * * @link https://wordpress.stackexchange.com/a/128578/2807 */ add_action( 'template_redirect', 'wpse_barcode_search_success_redirect' ); function wpse_barcode_search_success_redirect() { global $wp_query; if ( ! wpse_is_barcode_search( $wp_query ) ) { return; } // If we have a post, redirect to it. if ( '1' === $wp_query->found_posts ) { wp_redirect( get_permalink( $wp_query->posts['0']->ID ) ); exit; } } 

Finalmente, aqui está a function auxiliar usada para determinar se estamos realizando uma pesquisa usando o scanner de código de barras. Isso deve ser modificado para que ele funcione com o scanner usado (particularmente, o cheque usando $_REQUEST['barcode-reader'] ).

 /** * Helper function used to determine if a search is performed using * the barcode scanner. * * @uses array $_REQUEST * @param object $query * @return bool */ function wpse_is_barcode_search( $query ) { // Bail if $query is not an instance of WP_Query. if ( ! ( $query instanceof WP_Query ) ) { return false; } // Bail if this is the admin area. if ( $query->is_admin() ) { return false; } // Bail if this is not the search page or main query. if ( ! $query->is_search() || ! $query->is_main_query() ) { return false; } // Bail if this is not our special barcode search. if ( ! isset( $_REQUEST['barcode-reader'] ) || '1' !== $_REQUEST['barcode-reader'] ) { return false; } return true; } 

Modelo personalizado onde você possui query personalizada. Esta busca de query apenas um post e template mostra esta única post .