Make WordPress Core

Changeset 14072


Ignore:
Timestamp:
04/11/2010 01:51:24 PM (16 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.