【问题标题】:Error in filtering custom post by acf fields in admin在管理员中按 acf 字段过滤自定义帖子时出错
【发布时间】:2018-02-11 17:31:51
【问题描述】:

我正在通过 acf 字段“issue_year”为自定义帖子“杂志”添加过滤器。我创建下拉列表并过滤帖子,但出现以下错误。

错误:

WordPress database error Not unique table/alias: 'wp_postmeta' for query SELECT SQL_CALC_FOUND_ROWS DISTINCT wp_posts.ID FROM wp_posts  INNER JOIN wp_postmeta ON ( wp_posts.ID = wp_postmeta.post_id ) LEFT JOIN wp_postmeta ON wp_posts.ID = wp_postmeta.post_id  WHERE 1=1  AND ( 
  ( wp_postmeta.meta_key = 'issue_year' AND wp_postmeta.meta_value = '2017' )
) AND wp_posts.post_type = 'magazine' AND (wp_posts.post_status = 'publish' OR wp_posts.post_status = 'acf-disabled' OR wp_posts.post_status = 'future' OR wp_posts.post_status = 'draft' OR wp_posts.post_status = 'pending' OR wp_posts.post_status = 'private') GROUP BY wp_posts.ID ORDER BY wp_posts.post_date DESC LIMIT 0, 20 made by WP_List_Table->display, WP_List_Table->display_tablenav, WP_Posts_List_Table->extra_tablenav, do_action('manage_posts_extra_tablenav'), WP_Hook->do_action, WP_Hook->apply_filters, WPSEO_Link_Columns->count_objects, WPSEO_Link_Columns->set_count_objects, WP_Query->get_posts

代码: 对于下拉:

add_action('restrict_manage_posts', 'filter_experts_by_issue_year');
function filter_experts_by_issue_year() {
    $post_type = 'magazine';
    global $wpdb;
    $query = $wpdb->prepare('
        SELECT DISTINCT pm.meta_value FROM %1$s pm
        LEFT JOIN %2$s p ON p.ID = pm.post_id
        WHERE pm.meta_key = "%3$s" 
        AND p.post_status = "%4$s" 
        AND p.post_type = "%5$s"
        ORDER BY "%3$s"',
        $wpdb->postmeta,
        $wpdb->posts,
        'issue_year',
        'publish',
        $post_type
    );
    $results = $wpdb->get_col($query);
    if(empty($results))
        return;

    /** Grab all of the options that should be shown */
    $options[] = sprintf('<option value="-1">%1$s</option>', __('Issue Year', 'your-text-domain'));
    foreach($results as $result) :
        $options[] = sprintf('<option value="%1$s">%2$s</option>', esc_attr($result), $result);
    endforeach;

    /** Output the dropdown menu */
    echo '<select class="" id="issue_year" name="issue_year">';
    echo join("\n", $options);
    echo '</select>';
}

过滤器:

add_filter( 'parse_query', 'prefix_magazine_filter' );
function  prefix_magazine_filter($query) {
    global $pagenow;
    $current_page = isset( $_GET['post_type'] ) ? $_GET['post_type'] : '';

    if ( is_admin() && 'magazine' == $current_page && 'edit.php' == $pagenow && isset( $_GET['issue_year'] ) && $_GET['issue_year'] != '-1') {
        $query->query_vars['meta_key'] = 'issue_year';
        $query->query_vars['meta_value'] = $_GET['issue_year'];
        $query->query_vars['compare'] = '=';

    }
}

wp 版本:4.9.1 acf 专业版:5.6.5

【问题讨论】:

    标签: wordpress advanced-custom-fields


    【解决方案1】:

    在我看来你的 order by 子句有错误

    使用此代码

    $query = $wpdb->prepare('
        SELECT DISTINCT pm.meta_value 
        FROM $wpdb->postmeta pm
        LEFT JOIN $wpdb->posts p
        ON p.ID = pm.post_id
        WHERE pm.meta_key = "%s" 
        AND p.post_status = "%s" 
        AND p.post_type = "%s"
        ORDER BY pm.meta_value',
        'issue_year',
        'publish',
         $post_type
    );
    

    【讨论】:

    • 不工作仍然得到同样的错误。 [不是唯一的表/别名:'wp_postmeta']
    • 刚刚更新了查询,请检查并告诉我你得到了什么
    • 你能不能去掉 distinct 试试,也告诉我你用的是 WPML 插件吗,哪个版本的 WP,我又更新了查询,去掉 distinct 再试一次
    • 没有成功。现在我没有使用任何 WPML 插件。 WP 版本为 4.9,ACF Pro 版本为 5.6.5
    • @Deeoti chipdey ...单击“过滤器”按钮后,显示上述错误。
    【解决方案2】:

    我得到了导致错误的答案。对于前端搜索,我添加了以下 3 个过滤器。

    add_filter('posts_join', 'cf_search_join' );
    add_filter( 'posts_where', 'cf_search_where' );
    add_filter( 'posts_distinct', 'cf_search_distinct' );
    

    此错误是由添加的此过滤器引起的。因此,我将它们更改如下。

    if(!is_admin()) {
        add_filter('posts_join', 'cf_search_join' );
        add_filter( 'posts_where', 'cf_search_where' );
        add_filter( 'posts_distinct', 'cf_search_distinct' );
    }
    

    希望这会有所帮助。

    【讨论】:

      猜你喜欢
      • 2017-05-10
      • 2016-01-11
      • 1970-01-01
      • 2021-01-03
      • 2015-07-14
      • 2021-11-30
      • 2022-11-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多