Pesquisar somente postagens de blog (widget de pesquisa padrão do WP)

3

Eu estava usando este código:

add_filter( 'pre_get_posts','search_only_blog_posts' );

function search_only_blog_posts( $query ) {

    if ( $query->is_search ) {

        $query->set( 'post_type', 'post' );
    }
    return $query;
}

.. até eu perceber que se aplica a praticamente qualquer pesquisa padrão no WordPress (incluindo a pesquisa na página da lista de postagens na área de administração etc) .

Como posso fazer com que o widget de pesquisa pesquise apenas as postagens do blog (não postagens personalizadas, taxonomias, imagens etc.) para que ele não se aplique a qualquer pesquisa WP padrão (somente pesquisa de widget) ?

Ou é mais fácil apenas criar meu próprio widget de pesquisa?

Eu preferiria utilizar tudo o que o WordPress tem a oferecer e não reinventar a roda.

    
por N00b 21.02.2016 / 21:23

5 respostas

6

@PieterGoosen tem uma boa descrição de por que seu retorno de chamada pre_get_posts está causando um problema.

Aqui está uma solução alternativa para restringir o widget de pesquisa nativo ao tipo de postagem post :

/**
 * Restrict native search widgets to the 'post' post type
 */
add_filter( 'widget_title', function( $title, $instance, $id_base )
{
    // Target the search base
    if( 'search' === $id_base )
        add_filter( 'get_search_form', 'wpse_post_type_restriction' );
    return $title;
}, 10, 3 );

function wpse_post_type_restriction( $html )
{
    // Only run once
    remove_filter( current_filter(), __FUNCTION__ );

    // Inject hidden post_type value
    return str_replace( 
        '</form>', 
        '<input type="hidden" name="post_type" value="post" /></form>',
        $html 
    );
}  

onde usamos ajustar a saída da função get_search_form() , mas apenas para os widgets de pesquisa.

    
por birgire 22.02.2016 / 09:48
4

Seu uso de pre_get_posts está completamente errado.

  • pre_get_posts é uma ação, não um filtro. Verifique a fonte

    do_action_ref_array( 'pre_get_posts', array( &$this ) );
    

    Sim, add_filter funciona porque add_action chama add_filter , é por isso que seu código funcionará. Mas quanto ao uso adequado, é simplesmente errado. Se algo for uma ação, use add_action() . Isso só faz sentido

  • WP_Query::is_search ( e WP_Query::is_search() para essa matéria ) retorna true em qualquer consulta em que s é passado para WP_Query . Lembre-se, as tags condicionais dentro de WP_Query não são definidas de acordo com a URL, mas de acordo com a consulta vars passada para ela. Para a consulta principal, a consulta vars passada para WP_Query será proveniente da análise do URL.

  • pre_get_posts altera todas as instâncias de WP_Query , query_posts e get_posts , front end e back end, portanto, você desejaria segmentar apenas a consulta principal se quisesse segmentar apenas a consulta principal. Além disso, você só deseja segmentar o front end, especialmente para arquivos e consultas de pesquisa.

Aqui está um exemplo de como usar pre_get_posts corretamente para a consulta principal: ( Você pode alterar o fechamento para espaguete normal se desejar, apenas uma nota, use somente encerramentos se tiver certeza de que faria não deseja remover a ação mais tarde, pois as funções anônimas não podem ser removidas )

add_action( 'pre_get_posts', function ( $q )
{
    if (    !is_admin()         // Only target front end,
         && $q->is_main_query() // Only target the main query
         && $q->is_search()     // Only target the search page
    ) {
        $q->set( 'post_type', ['my_custom_post_type', 'post'] );
    }
});

Para responder à sua pergunta sobre o widget de pesquisa, aqui está o que eu encontrei

  • O widget de pesquisa basta chamar get_search_form()

  • Não há filtro útil para segmentar especificamente o widget de pesquisa. Os filtros disponíveis em get_search_form() segmentarão todos os formulários que usam get_search_form()

Com o acima, você precisa criar seu próprio widget de pesquisa com seu próprio formulário personalizado

Você pode tentar o seguinte: ( Modificado a partir do widget de pesquisa principal, observe, tudo não foi testado )

class My_Custom_Search extends WP_Widget {
    /**
     * Sets up a new Search widget instance.
     *
     * @since 1.0.0
     * @access public
     */
    public function __construct() {
        $widget_ops = [
            'classname'   => 'widget_custom_search', 
            'description' => __( "A custom search form for your site.")
        ];
        parent::__construct( 'custom-search', _x( 'Custom search', 'My custom search widget' ), $widget_ops );
    }

    /**
     * Outputs the content for the current Search widget instance.
     *
     * @since 1.0.0
     * @access public
     *
     * @param array $args     Display arguments including 'before_title', 'after_title',
     *                        'before_widget', and 'after_widget'.
     * @param array $instance Settings for the current Search widget instance.
     */
    public function widget( $args, $instance ) {
        /** This filter is documented in wp-includes/widgets/class-wp-widget-pages.php */
        $title = apply_filters( 'widget_title', empty( $instance['title'] ) ? '' : $instance['title'], $instance, $this->id_base );
        echo $args['before_widget'];

        if ( $title ) {
            echo $args['before_title'] . $title . $args['after_title'];
        }

        $form = '<form role="search" method="get" class="search-form" action="' . esc_url( home_url( '/' ) ) . '">
            <label>
                <span class="screen-reader-text">' . _x( 'Search for:', 'label' ) . '</span>
                <input type="search" class="search-field" placeholder="' . esc_attr_x( 'Search &hellip;', 'placeholder' ) . '" value="' . get_search_query() . '" name="s" title="' . esc_attr_x( 'Search for:', 'label' ) . '" />
            </label>
            <input type="hidden" value="post" name="post_type" id="post_type" />
            <input type="submit" class="search-submit" value="'. esc_attr_x( 'Search', 'submit button' ) .'" />
        </form>';

        echo $form;

        echo $args['after_widget'];
    }

    /**
     * Outputs the settings form for the Search widget.
     *
     * @since 1.0.0
     * @access public
     *
     * @param array $instance Current settings.
     */
    public function form( $instance ) {
        $instance = wp_parse_args( (array) $instance, ['title' => '')];
        $title = $instance['title'];
        ?>
        <p><label for="<?php echo $this->get_field_id('title'); ?>"><?php _e('Title:'); ?> <input class="widefat" id="<?php echo $this->get_field_id('title'); ?>" name="<?php echo $this->get_field_name('title'); ?>" type="text" value="<?php echo esc_attr($title); ?>" /></label></p>
        <?php
    }

    /**
     * Handles updating settings for the current Search widget instance.
     *
     * @since 1.0.0
     * @access public
     *
     * @param array $new_instance New settings for this instance as input by the user via
     *                            WP_Widget::form().
     * @param array $old_instance Old settings for this instance.
     * @return array Updated settings.
     */
    public function update( $new_instance, $old_instance ) {
        $instance = $old_instance;
        $new_instance = wp_parse_args((array) $new_instance, ['title' => '')];
        $instance['title'] = sanitize_text_field( $new_instance['title'] );
        return $instance;
    }
}
    
por Pieter Goosen 22.02.2016 / 08:08
1

Você pode simplesmente colocar isso no arquivo functions.php.

function SearchFilter($query) 
{
    if (($query->is_search)&&(!is_admin())) {
        $query->set('post_type', 'post');
    }
    return $query;
}

add_filter('pre_get_posts','SearchFilter');
    
por Richard K 12.04.2016 / 14:53
0

Basta escrever este código no seu tema WordPress functions.php.

function wpdocs_my_search_form( $form ) {
$form = '<form role="search" method="get" id="searchform" class="searchform" action="' . home_url( '/' ) . '" >
<div><label class="screen-reader-text" for="s">' . __( 'Search for:' ) . '</label>
<input type="text" value="' . get_search_query() . '" name="s" id="s" />
<input type="hidden" value="post" name="post_type" id="post_type" />
<input type="submit" id="searchsubmit" value="'. esc_attr__( 'Search' ) .'" />
</div>
</form>';

return $form;
} add_filter( 'get_search_form', 'wpdocs_my_search_form' );
    
por Mentik Yusmantara 16.09.2017 / 02:38
-3

Por favor, consulte este código e ajuste seguinte link

    
por Nik 22.02.2016 / 07:30

Tags