2017-12-18 53 views
1

首先,我想对我在WordPress开发中的糟糕知识表示歉意。如何根据作为查询字符串参数传递的user_id过滤admin中的自定义帖子类型列表中的记录

是否有任何选项,我可以进一步过滤管理员基于user_id的自定义帖子类型的帖子列表,如果相同已被传递为查询字符串,如http://album.multibaselocal.com/wp-admin/edit.php?post_type=albums&user_id=31

这是我想要实现的: 我有一个自定义的帖子类型,名为album,网站用户使用它来上传相册到系统。默认情况下,当我进入列表页面时,所有相册都可以正常使用。在用户列表页面中,我添加了一个自定义列,显示每个用户链接回专辑列表页面的已发布专辑数,查询字符串为user_id,如上所示。

我想通过user_id过滤相册我已通过。这可能吗?

我想这一点:

add_filter('parse_query', 'filter_albums_further_if_user_id_found'); 

function filter_albums_further_if_user_id_found($query) { 
    if(isset($_GET['user_id']) && !empty($_GET['user_id'])) { 
     $user_id = $_GET['user_id']; 

     $requery = array(
      'post_type' => 'albums', 
      'post_author' => $user_id, 
      'status' => 'publish', 
      'posts_per_page' => -1, 
     ); 

     // What to do here? 
    } 
} 

我在这里完全丧失。不是有经验的WP开发人员!

如果我没有明白这一切都是错误的,因为我使用的钩子被称为parse_query,我不得不以某种方式再次解析查询并使用user_id筛选现有结果。但不知道在哪里以及如何:(

您的帮助将不胜感激

EDIT(查询输出):

WP_Query Object 
(
    [query] => Array 
     (
      [post_type] => albums 
      [posts_per_page] => 20 
     ) 

    [query_vars] => Array 
     (
      [post_type] => albums 
      [posts_per_page] => 20 
      [error] => 
      [m] => 
      [p] => 0 
      [post_parent] => 
      [subpost] => 
      [subpost_id] => 
      [attachment] => 
      [attachment_id] => 0 
      [name] => 
      [static] => 
      [pagename] => 
      [page_id] => 0 
      [second] => 
      [minute] => 
      [hour] => 
      [day] => 0 
      [monthnum] => 0 
      [year] => 0 
      [w] => 0 
      [category_name] => 
      [tag] => 
      [cat] => 
      [tag_id] => 
      [author] => 
      [author_name] => 
      [feed] => 
      [tb] => 
      [paged] => 0 
      [meta_key] => user_id 
      [meta_value] => 31 
      [preview] => 
      [s] => 
      [sentence] => 
      [title] => 
      [fields] => 
      [menu_order] => 
      [embed] => 
      [category__in] => Array 
       (
       ) 

      [category__not_in] => Array 
       (
       ) 

      [category__and] => Array 
       (
       ) 

      [post__in] => Array 
       (
       ) 

      [post__not_in] => Array 
       (
       ) 

      [post_name__in] => Array 
       (
       ) 

      [tag__in] => Array 
       (
       ) 

      [tag__not_in] => Array 
       (
       ) 

      [tag__and] => Array 
       (
       ) 

      [tag_slug__in] => Array 
       (
       ) 

      [tag_slug__and] => Array 
       (
       ) 

      [post_parent__in] => Array 
       (
       ) 

      [post_parent__not_in] => Array 
       (
       ) 

      [author__in] => Array 
       (
       ) 

      [author__not_in] => Array 
       (
       ) 

     ) 

    [tax_query] => WP_Tax_Query Object 
     (
      [queries] => Array 
       (
       ) 

      [relation] => AND 
      [table_aliases:protected] => Array 
       (
       ) 

      [queried_terms] => Array 
       (
       ) 

      [primary_table] => 
      [primary_id_column] => 
     ) 

    [meta_query] => 
    [date_query] => 
    [post_count] => 0 
    [current_post] => -1 
    [in_the_loop] => 
    [comment_count] => 0 
    [current_comment] => -1 
    [found_posts] => 0 
    [max_num_pages] => 0 
    [max_num_comment_pages] => 0 
    [is_single] => 
    [is_preview] => 
    [is_page] => 
    [is_archive] => 1 
    [is_date] => 
    [is_year] => 
    [is_month] => 
    [is_day] => 
    [is_time] => 
    [is_author] => 
    [is_category] => 
    [is_tag] => 
    [is_tax] => 
    [is_search] => 
    [is_feed] => 
    [is_comment_feed] => 
    [is_trackback] => 
    [is_home] => 
    [is_404] => 
    [is_embed] => 
    [is_paged] => 
    [is_admin] => 1 
    [is_attachment] => 
    [is_singular] => 
    [is_robots] => 
    [is_posts_page] => 
    [is_post_type_archive] => 1 
    [query_vars_hash:WP_Query:private] => 1c0b485390fc9607d8008a14177bd63d 
    [query_vars_changed:WP_Query:private] => 
    [thumbnails_cached] => 
    [stopwords:WP_Query:private] => 
    [compat_fields:WP_Query:private] => Array 
     (
      [0] => query_vars_hash 
      [1] => query_vars_changed 
     ) 

    [compat_methods:WP_Query:private] => Array 
     (
      [0] => init_query_flags 
      [1] => parse_tax_query 
     ) 

) 

EDIT(函数体目前正在使用):

add_action('pre_get_posts', 'filter_albums_further_if_user_id_found'); 

function filter_albums_further_if_user_id_found($query) { 
    if(!is_admin()) 
     return; 

    if(isset($_GET['user_id']) && !empty($_GET['user_id'])) { 
     $user_id = $_GET['user_id']; 

     $query->set('meta_key', 'user_id'); 
     $query->set('meta_value', $user_id); 

    } 

    echo '<pre>'; print_r($query); echo '</pre>'; die(); 
} 

回答

1

这让我想起了几周前的一个类似的问题。 ng来调整'orderby'部分的查询,但我相信你可以用同样的动作完成你的任务。尝试使用“pre_get_posts”操作而不是该过滤器。我没有测试过,所以让我知道它是否有效!

正确答案(用户输入之后EDITED):

function user_id_filter($query) { 
    if (! is_admin() && !$query->is_main_query()) 
     return; 

    if(isset($_GET['user_id']) && !empty($_GET['user_id'])) { 
     $user_id = $_GET['user_id']; 
     $query->set('author', $user_id); 
    } 
    //Debug if necessary 
    //echo '<pre>'; print_r($query); echo '</pre>'; die(); 
} 
add_action('pre_get_posts', 'user_id_filter', 500000000); 

我用这作为参考。 https://codex.wordpress.org/Plugin_API/Action_Reference/pre_get_posts

+0

谢谢您的回复。我在我的functions.php中添加了你的代码,但是现在在查询字符串中传递user_id时没有可见的帖子。但是,当我从url中获取user_id参数时,会为所有用户加载相册。 –

+0

取消注释“print_r”部分,以便我们可以看到查询的外观和分享内容! – Samyer

+0

再次感谢您的支持!我编辑了我的原始问题并添加了查询输出。 –

相关问题