Wordpress管理员搜索帖子错误 - 帖子类型无效

时间:2013-03-22 15:31:29

标签: wordpress search post admin custom-post-type

我有一个网站,其中包含使用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

在第二次搜索中,网址类似于:

http://www.site.com/wp-admin/edit.php?s=SearchTerm2&post_status=all&post_type=Array&_wpnonce=4d88f268e4&_wp_http_referer=%2Fwp-admin%2Fedit.php%3Fs%3DSearchTerm1%26post_status%3Dall%26post_type%3Dpost%26action%3D-1%26m%3D0%26cat%3D0%26paged%3D1%26mode%3Dlist%26action2%3D-1&action=-1&m=0&cat=0&paged=1&mode=list&action2=-1

错误消息:“帖子类型无效”。

我取消了所有插件,我将wordpress升级到最新版本3.5.1,我将固定链接重置为默认值,但此错误仍然存​​在。

非常感谢任何帮助!

谢谢

3 个答案:

答案 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' );