Ticket #12704: 12704.diff

File 12704.diff, 3.9 KB (added by dd32, 3 years ago)

largely untested

  • wp-includes/query.php

     
    17121712                if ( $q['day'] ) 
    17131713                        $where .= " AND DAYOFMONTH($wpdb->posts.post_date)='" . $q['day'] . "'"; 
    17141714 
     1715                // If a name is not requested, AND we've got a post_type AND its not any post_type. 
    17151716                if ( !empty($q['post_type']) && 'any' != $q['post_type'] ) { 
    1716                         $_pt = is_array($q['post_type']) ? $q['post_type'] : array($q['post_type']); 
    1717                         foreach ( $_pt as $_post_type ) { 
    1718                                 if ( empty($q[ $_post_type ]) ) 
     1717                        foreach ( (array)$q['post_type'] as $_post_type ) { 
     1718                                $post_type_object = get_post_type_object($_post_type); 
     1719 
     1720                                if ( !$post_type_object || !$post_type_object->query_var || empty($q[ $post_type_object->query_var ]) ) 
    17191721                                        continue; 
     1722                                $pt_qv = $post_type_object->query_var; 
    17201723 
    1721                                 $q[ $_post_type ] = str_replace('%2F', '/', urlencode(urldecode($q[ $_post_type ]))); 
    1722                                 $post_type_object = get_post_type_object($_post_type); 
    1723                                 if ( ! $post_type_object->hierarchical || strpos($q[ $_post_type ], '/') === false) { 
    1724                                         $q['name'] = $q[ $_post_type ] = sanitize_title($q[ $_post_type ]); 
    1725                                         $_names[] = $q[ $_post_type ]; 
     1724                                if ( ! $post_type_object->hierarchical || strpos($q[ $pt_qv ], '/') === false) { 
     1725                                        $q['name'] = $q[ $pt_qv ]; 
    17261726                                } else { 
    1727                                         // Hierarchical post type, need to look deeper to see if its an attachment or this post_type 
    1728                                         if ( isset($this->queried_object_id) ) { 
    1729                                                 $reqpage = $this->queried_object_id; 
    1730                                         } else { 
    1731                                                 $reqpage = get_page_by_path($q[ $_post_type ], OBJECT, $_post_type); 
    1732                                                 if ( !empty($reqpage) ) 
    1733                                                         $reqpage = $reqpage->ID; 
    1734                                                 else 
    1735                                                         $reqpage = 0; 
    1736                                         } 
    1737                                         $_ids[] = $reqpage; 
    1738                                         $reqpage_obj = get_page($reqpage); 
    1739                                         if ( is_object($reqpage_obj) && 'attachment' == $reqpage_obj->post_type ) { 
    1740                                                 $this->is_attachment = true; 
    1741                                                 $q['attachment_id'] = $reqpage; 
    1742                                                 $post_type = $q['post_type'] = 'attachment'; 
    1743                                         } 
     1727                                        $q['pagename'] = $q[ $pt_qv ]; 
     1728                                        $q['name'] = ''; 
    17441729                                } 
     1730 
     1731                                break; // Right now, name + pagename can only support 1 query for a name, so lets break at this point since we've filled it with something. 
    17451732                        } //end foreach 
     1733                } 
    17461734 
    1747                         if ( !empty($_names) || !empty($_ids) ) { 
    1748                                 $where .= ' AND (1=0'; 
    1749                                 if ( !empty($_names) ) 
    1750                                         $where .= " OR $wpdb->posts.post_name IN('" . implode("', '", $_names) . "')"; 
    1751                                 if ( !empty($_ids) ) { 
    1752                                         $_ids = array_map('absint', $_ids); 
    1753                                         $where .= " OR $wpdb->posts.ID IN(" . implode(',', $_ids) . ")"; 
    1754                                 } 
    1755                                 $where .= ')'; 
    1756                         } 
    1757                         unset($_ids, $_names, $_pt, $_post_type); 
    1758                 } elseif ( '' != $q['name'] ) { 
     1735                if ( '' != $q['name'] ) { 
    17591736                        $q['name'] = sanitize_title($q['name']); 
    17601737                        $where .= " AND $wpdb->posts.post_name = '" . $q['name'] . "'"; 
    17611738                } elseif ( '' != $q['pagename'] ) { 
    1762                         if ( isset($this->queried_object_id) ) 
     1739                        if ( isset($this->queried_object_id) ) { 
    17631740                                $reqpage = $this->queried_object_id; 
    1764                         else { 
    1765                                 $reqpage = get_page_by_path($q['pagename']); 
     1741                        } else { 
     1742                                if ( 'page' != $post_type ) { 
     1743                                        foreach ( (array)$post_type as $ptype ) { 
     1744                                                $ptype_object = get_post_type_object($ptype); 
     1745                                                if ( !$ptype_object || !$post_type_object->hierarchical ) 
     1746                                                        continue; 
     1747 
     1748                                                $reqpage = get_page_by_path($q['pagename'], OBJECT, $ptype); 
     1749                                                if ( $reqpage ) 
     1750                                                        break; 
     1751                                        } 
     1752                                } else { 
     1753                                        $reqpage = get_page_by_path($q['pagename']); 
     1754                                } 
    17661755                                if ( !empty($reqpage) ) 
    17671756                                        $reqpage = $reqpage->ID; 
    17681757                                else 
     
    17791768                                $reqpage_obj = get_page($reqpage); 
    17801769                                if ( is_object($reqpage_obj) && 'attachment' == $reqpage_obj->post_type ) { 
    17811770                                        $this->is_attachment = true; 
     1771                                        $post_type = $q['post_type'] = 'attachment'; 
    17821772                                        $this->is_page = true; 
    17831773                                        $q['attachment_id'] = $reqpage; 
    17841774                                }