您对的使用pre_get_posts
是完全错误的。
pre_get_posts
是一个操作,而不是筛选器。检查sourcedo_action_ref_array( \'pre_get_posts\', array( &$this ) );
是的,add_filter
工作的原因是add_action
呼叫add_filter
, 这就是为什么您的代码可以工作的原因。但就正确使用而言,这完全是错误的。如果某件事是一个动作,请使用add_action()
. 这很有道理WP_Query::is_search
(和WP_Query::is_search()
因此,在any 查询位置s
已传递给WP_Query
. 记住,里面的条件标记WP_Query
不是根据URL设置的,而是根据传递给它的查询变量设置的。对于主查询,查询变量传递给WP_Query
将来自解析URL。pre_get_posts
更改的所有实例WP_Query
, query_posts
和get_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 …\', \'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;
}
}