WordPress.org

Make WordPress Core

Changeset 14072


Ignore:
Timestamp:
04/11/2010 01:51:24 PM (8 years ago)
Author:
dd32
Message:

Alternative implementation of custom post_type query_var handling. fills name & pagename for custom post_types to reduce amount of code duplication. See #12704

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/wp-includes/query.php

    r14027 r14072  
    17131713            $where .= " AND DAYOFMONTH($wpdb->posts.post_date)='" . $q['day'] . "'";
    17141714
     1715        // If 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                $ptype_obj = get_post_type_object($_post_type);
     1719                if ( !$ptype_obj || !$ptype_obj->query_var || empty($q[ $ptype_obj->query_var ]) )
    17191720                    continue;
    17201721
    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 ];
     1722                if ( ! $ptype_obj->hierarchical || strpos($q[ $ptype_obj->query_var ], '/') === false) {
     1723                    // Non-hierarchical post_types & parent-level-hierarchical post_types can directly use 'name'
     1724                    $q['name'] = $q[ $ptype_obj->query_var ];
    17261725                } 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                     }
     1726                    // Hierarchical post_types will operate through the
     1727                    $q['pagename'] = $q[ $ptype_obj->query_var ];
     1728                    $q['name'] = '';
    17441729                }
     1730
     1731                // Only one request for a slug is possible, this is why name & pagename are overwritten above.
     1732                break;
    17451733            } //end foreach
    1746 
    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'] ) {
     1734            unset($ptype_obj);
     1735        }
     1736
     1737        if ( '' != $q['name'] ) {
    17591738            $q['name'] = sanitize_title($q['name']);
    17601739            $where .= " AND $wpdb->posts.post_name = '" . $q['name'] . "'";
    17611740        } elseif ( '' != $q['pagename'] ) {
    1762             if ( isset($this->queried_object_id) )
     1741            if ( isset($this->queried_object_id) ) {
    17631742                $reqpage = $this->queried_object_id;
    1764             else {
    1765                 $reqpage = get_page_by_path($q['pagename']);
     1743            } else {
     1744                if ( 'page' != $q['post_type'] ) {
     1745                    foreach ( (array)$q['post_type'] as $_post_type ) {
     1746                        $ptype_obj = get_post_type_object($_post_type);
     1747                        if ( !$ptype_obj || !$ptype_obj->hierarchical )
     1748                            continue;
     1749
     1750                        $reqpage = get_page_by_path($q['pagename'], OBJECT, $_post_type);
     1751                        if ( $reqpage )
     1752                            break;
     1753                    }
     1754                    unset($ptype_obj);
     1755                } else {
     1756                    $reqpage = get_page_by_path($q['pagename']);
     1757                }
    17661758                if ( !empty($reqpage) )
    17671759                    $reqpage = $reqpage->ID;
     
    17801772                if ( is_object($reqpage_obj) && 'attachment' == $reqpage_obj->post_type ) {
    17811773                    $this->is_attachment = true;
     1774                    $post_type = $q['post_type'] = 'attachment';
    17821775                    $this->is_page = true;
    17831776                    $q['attachment_id'] = $reqpage;
Note: See TracChangeset for help on using the changeset viewer.