仅搜索博客帖子(默认WP搜索小工具)

时间:2016-02-21 作者:N00b

我使用的代码是:

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;
}
<小时>。。直到我意识到它几乎适用于WordPress中的任何默认搜索(包括在管理区域的帖子列表页面中的搜索等)。

How could I make the search widget to only search blog posts (不是自定义帖子、分类法、图像等)so that it doesn\'t apply to any default WP search (仅小部件搜索)?

还是只制作自己的搜索小部件更容易?

我宁愿利用WordPress提供的一切,而不是重新发明轮子。

5 个回复
最合适的回答,由SO网友:birgire 整理而成

@PieterGoosen很好地描述了pre_get_posts 回调给您带来了一个问题。

这里有一个替代解决方案,可以将本机搜索小部件限制为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 
    );
}  
我们使用调整get_search_form() 功能,但仅适用于搜索小部件。

SO网友:Pieter Goosen

您对的使用pre_get_posts 是完全错误的。

  • pre_get_posts 是一个操作,而不是筛选器。检查source

    do_action_ref_array( \'pre_get_posts\', array( &$this ) );
    
    是的,add_filter 工作的原因是add_action 呼叫add_filter, 这就是为什么您的代码可以工作的原因。但就正确使用而言,这完全是错误的。如果某件事是一个动作,请使用add_action(). 这很有道理

  • WP_Query::is_searchWP_Query::is_search() 因此,在any 查询位置s 已传递给WP_Query. 记住,里面的条件标记WP_Query 不是根据URL设置的,而是根据传递给它的查询变量设置的。对于主查询,查询变量传递给WP_Query 将来自解析URL。

  • pre_get_posts 更改的所有实例WP_Query, query_postsget_posts, 不管前端和后端如何,因此如果只希望以主查询为目标,则只希望以主查询为目标。此外,您只希望以前端为目标,特别是针对归档和搜索查询。

    以下是一个关于如何使用的示例pre_get_posts 对于主查询正确:(如果愿意,您可以将闭包更改为普通意大利面条,只需注意,如果您确定以后不想删除操作,因为无法删除匿名函数,请仅使用闭包)

    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\'] );
        }
    });
    
    为了回答您关于搜索小部件的问题,下面是我找到的

    search widget 简单呼叫get_search_form()

    没有专门针对搜索小部件的有用过滤器。中可用的筛选器get_search_form() 将针对使用get_search_form()

根据以上内容,您需要使用自己的自定义表单创建自己的搜索小部件

您可以尝试以下操作:(从核心搜索小部件修改,注意,所有内容都未经测试)

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;
    }
}

SO网友:Richard K

您可以简单地将其放入函数中。php文件。

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

add_filter(\'pre_get_posts\',\'SearchFilter\');

SO网友:Mentik Yusmantara

只需在函数上编写此代码。php WordPress主题。

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\' );

SO网友:Nik

请参考此代码和设置following link

相关推荐

nothing happen in search form

我想创建搜索表单,但当我搜索时什么都没有发生,这是代码:索引。php: <div class=\"tech-btm\"> <?php get_search_form();?> </div> 搜索表单:<form role=\"search\" method=\"get\" id=\"searchform\" action=\"<?php echo home_url(\'/\')?>\"> &