我有一个网站,其中包含使用Ultimate CMS插件创建的一些自定义帖子类型。 在管理区域,当我进行新的搜索时,结果是可以的,但在那之后,当我尝试进行第二次搜索时,它会给我一个错误“无效的帖子类型”。
我也意识到这个网址不合适:
在第一次搜索中,网址是这样的: http://www.site.com/wp-admin/edit.php?s=SearchTerm1&post_status=all&post_type=post&action=-1&m=0&cat=0&paged=1&mode=list&action2=-1
在第二次搜索中,网址类似于:
错误消息:“帖子类型无效”。
我取消了所有插件,我将wordpress升级到最新版本3.5.1,我将固定链接重置为默认值,但此错误仍然存在。
非常感谢任何帮助!
谢谢
答案 0 :(得分:1)
我也遇到过这个问题,发现这是我的functions.php文件中的一个函数导致修改全局wordpress查询参数的结果。
听起来您编辑了全局$query
对象。如果您使用了诸如'pre_get_posts'之类的钩子并操纵了$query
对象并且您没有排除管理区域,那么您对查询参数所做的任何更改也将应用于管理面板,它将显示尝试添加不适合您的搜索的参数时出现错误。
例如:
假设您的网站上有搜索功能,当用户输入搜索并转到搜索结果页时,您只想显示名为$searchable_posts
的自定义帖子类型的帖子,那么您会在functions.php
文件中添加一个钩子,如下所示:
function searchfilter($query) {
if ($query->is_search && $query->is_main_query() ) {
$query->set('post_type', $searchable_posts);
}
return $query;
}
add_filter('pre_get_posts', 'searchfilter');
这将使任何全局默认$query
仅搜索匹配帖子类型为$searchable_posts
的结果。但是,上面写的方式意味着这也适用于管理面板中的任何全局$query
。
解决这个问题的方法是构建你的查询:
function searchfilter($query) {
if ($query->is_search && $query->is_main_query() && !is_admin() ) {
$query->set('post_type', $searchable_posts);
}
return $query;
}
add_filter('pre_get_posts', 'searchfilter');
添加!is_admin()
表示您的函数会在后端管理面板中排除任何内容(请参阅is_admin)。
或者,更安全的方法是,如果可以,而不是使用全局默认$query
,则创建自己的新WP_Query并使用相应的搜索 - 编解码器有很好的示例说明如何设置起来。
答案 1 :(得分:0)
我也遇到了与您相同的问题,最后我找到了解决方案。
我们必须在$query->is_main_query()
。
下面是完整的代码。
function acf_meta_value_filter() {
global $typenow;
global $wp_query;
if ( $typenow == 'your_custom_post_type_name' ) { // Your custom post type meta_key_name
$plugins = array( 'value1', 'value2', 'value3' ); // Options for the filter select field
$current_plugin = '';
if( isset( $_GET['meta_key_name'] ) ) {
$current_plugin = $_GET['meta_key_name']; // Check if option has been selected
} ?>
<select name="meta_key_name" id="meta_key_name">
<option value="all" <?php selected( 'all', $current_plugin ); ?>><?php _e( 'All', '' ); ?></option>
<?php foreach( $plugins as $key=>$value ) { ?>
<option value="<?php echo esc_attr( $value ); ?>" <?php selected( $value, $current_plugin ); ?>><?php echo esc_attr( $value ); ?></option>
<?php } ?>
</select>
<?php }
}
add_action( 'restrict_manage_posts', 'acf_meta_value_filter' );
function acf_meta_value_filter_by_slug( $query ) {
global $pagenow;
// Get the post type
$post_type = isset( $_GET['post_type'] ) ? $_GET['post_type'] : '';
if ( is_admin() && $pagenow=='edit.php' && $post_type == 'your_custom_post_type_name' && isset( $_GET['meta_key_name'] ) && $_GET['meta_key_name'] !='all' && $query->is_main_query()) {
$query->query_vars['meta_key'] = 'meta_key_name';
$query->query_vars['meta_value'] = $_GET['meta_key_name'];
$query->query_vars['meta_compare'] = '=';
}
}
add_filter( 'parse_query', 'acf_meta_value_filter_by_slug' );
答案 2 :(得分:0)
我从其他开发人员手中接管的网站也遇到了类似的问题。
function anty_search_form( $query ) {
if ( $query->is_search ) {
$query->set( 'post_type', array('post', 'product') );
}
return $query;
}
add_filter( 'pre_get_posts', 'anty_search_form' );
有人忘记从 wp-admin 页面中排除此功能。因此,更改为此有助于无效的帖子类型。
function anty_search_form( $query ) {
if (!is_admin()){
if ( $query->is_search ) {
$query->set( 'post_type', array('post', 'product') );
}
return $query;
}
}
add_filter( 'pre_get_posts', 'anty_search_form' );