4

我有一个网站,其中包含一些使用 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,我将永久链接重置为默认值,但这个错误仍然存​​在。

任何帮助将非常感激!

谢谢

4

3 回答 3

5

我也遇到了这个问题,发现这是我的 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并使用它进行搜索,而不是使用全局默认值 - 法典有很好的示例来说明如何设置它。

于 2018-02-02T20:09:18.013 回答
0

我也遇到了和你一样的问题,最后我得到了解决方案。

我们必须添加$query->is_main_query()IF 条件。

下面是完整的代码。

 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' );
于 2019-05-16T06:15:27.823 回答
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' );
于 2021-01-05T12:28:42.083 回答