如何通过PRE_GET_POST从主查询中删除附件?

时间:2014-02-24 作者:WhyCry

我正在努力找到以下问题的解决方案。

主查询应仅检查页面和所选自定义帖子类型,以获取所选帖子类型名称。

地址。com/flower post name[自定义帖子类型]

  • 地址。com/flower-page-name[页面]
  • 正如您所看到的,我的自定义帖子类型使用此解决方案将slug从permalink中删除vip.wordpress.com.

    我遇到的问题是,查询还检查是否有具有相同slug的附件。因此,尽管帖子和页面都有独特的slug,但仍然与我的媒体库存在冲突。

    地址。com/post名称[附件]->显示地址。应显示com/post name[自定义帖子类型]->是否有方法从主查询中排除附件?

    这是我正在使用的代码:

    function vipx_parse_request_tricksy( $query ) {
    // Only noop the main query
    if ( ! $query->is_main_query() )
        return;
    // Only noop our very specific rewrite rule match
    if ( 2 != count( $query->query )
        || ! isset( $query->query[\'page\'] ) )
        return;
    // \'name\' will be set if post permalinks are just post_name, otherwise the page rule will match
    if ( ! empty( $query->query[\'name\'] ) )
        $query->set( \'post_type\', array( \'flower\', \'page\' ) );
    } add_action( \'pre_get_posts\', \'vipx_parse_request_tricksy\' );
    
    据我所知,正在重写查询,以检查是否有自定义的帖子类型“flower”,然后是带有特定slug的“page”。

    $query->set( \'post_type\', array( \'flower\', \'page\', \'attachment\' ) );
    
    我尝试了这种方法,但没有成功。Wordpress仍在检查slug是否首先对应于附件,并且显示的页面是否是媒体页面,而不是自定义帖子类型页面。

    1 个回复
    最合适的回答,由SO网友:Shazzad 整理而成

    而不是使用pre_get_posts 胡克,你可以尝试一种更好的方法parse_request 钩代码-

    add_action( \'parse_request\', \'my_cpt_parse_request\', 11, 2 );
    function my_cpt_parse_request( $wp )
    {
        if( isset($wp->request) && !is_admin() )
        {
            $requests = explode(\'/\', $wp->request);
            $request_amount = count($requests);
            $post_name = array_shift( $requests );
    
            // if an attachment has been queried under this or another post type, skip checking
            if( $request_amount > 1 && !in_array( $requests[\'0\'], array(\'feed\', \'page\') ) )
                return;
    
            global $wpdb;
            $post = $wpdb->get_row( $wpdb->prepare( 
                "SELECT * FROM $wpdb->posts WHERE post_status=\'publish\' AND post_type=%s AND post_name=%s",
                \'flower\', 
                $post_name
            ));
    
            if( $post && isset($post->ID) ){
                $wp->set_query_var( \'flower\', $post->post_name );
                $wp->set_query_var( \'post_type\', \'flower\' );
                $wp->set_query_var( \'name\', $post->post_name );
                $wp->set_query_var( \'attachment\', false );
                $wp->set_query_var( \'error\', false );
                return;
            }
        }
    }
    
    删除pre_get_post hook 使用这个,但保持post_type_link 按原样钩住。

    结束

    相关推荐

    how to edit attachments?

    在将例如文件附加到帖子时,如何在事后编辑/删除它们?在帖子编辑器中找不到任何内容。谢谢