WordPress.org

Make WordPress Core

Ticket #14675: patch.patch

File patch.patch, 7.0 KB (added by johnpbloch, 5 years ago)
  • wp-includes/post.php

     
    870870                        $wp_rewrite->add_rewrite_tag("%$post_type%", '(.+?)', $args->query_var ? "{$args->query_var}=" : "post_type=$post_type&name="); 
    871871                else 
    872872                        $wp_rewrite->add_rewrite_tag("%$post_type%", '([^/]+)', $args->query_var ? "{$args->query_var}=" : "post_type=$post_type&name="); 
    873                 $wp_rewrite->add_permastruct($post_type, "{$args->rewrite['slug']}/%$post_type%", $args->rewrite['with_front'], $args->permalink_epmask); 
     873                $wp_rewrite->add_permastruct($post_type, "%post_type%/%$post_type%", $args->rewrite['with_front'], $args->permalink_epmask); 
    874874        } 
    875875 
    876876        if ( $args->register_meta_box_cb ) 
  • wp-includes/link-template.php

     
    7878 * @return string 
    7979 */ 
    8080function get_permalink($id = 0, $leavename = false) { 
     81 
     82        if ( is_object($id) && isset($id->filter) && 'sample' == $id->filter ) { 
     83                $post = $id; 
     84                $sample = true; 
     85        } else { 
     86                $post = &get_post($id); 
     87                $sample = false; 
     88        } 
     89 
     90        if ( empty($post->ID) ) 
     91                return false; 
     92 
    8193        $rewritecode = array( 
    8294                '%year%', 
    8395                '%monthnum%', 
     
    90102                '%category%', 
    91103                '%author%', 
    92104                $leavename? '' : '%pagename%', 
     105                '%post_type%', 
     106                $leavename? '' : '%'.$post->post_type.'%', 
    93107        ); 
    94  
    95         if ( is_object($id) && isset($id->filter) && 'sample' == $id->filter ) { 
    96                 $post = $id; 
    97                 $sample = true; 
     108         
     109        if ( $post->post_type == 'page' ){ 
     110                return get_page_link($post->ID, $leavename, $sample); 
     111        } elseif ( $post->post_type == 'attachment' ){ 
     112                return get_attachment_link($post->ID); 
     113        } elseif ( in_array($post->post_type, get_post_types( array('_builtin' => false) ) ) ){ 
     114                global $wp_rewrite; 
     115                $permalink = $wp_rewrite->get_extra_permastruct($post->post_type); 
    98116        } else { 
    99                 $post = &get_post($id); 
    100                 $sample = false; 
     117                $permalink = get_option('permalink_structure'); 
    101118        } 
     119        $post_type = get_post_type_object( $post->post_type ); 
    102120 
    103         if ( empty($post->ID) ) 
    104                 return false; 
    105  
    106         if ( $post->post_type == 'page' ) 
    107                 return get_page_link($post->ID, $leavename, $sample); 
    108         elseif ( $post->post_type == 'attachment' ) 
    109                 return get_attachment_link($post->ID); 
    110         elseif ( in_array($post->post_type, get_post_types( array('_builtin' => false) ) ) ) 
    111                 return get_post_permalink($post->ID, $leavename, $sample); 
    112  
    113         $permalink = get_option('permalink_structure'); 
    114  
    115121        $permalink = apply_filters('pre_post_link', $permalink, $post, $leavename); 
    116122 
    117         if ( '' != $permalink && !in_array($post->post_status, array('draft', 'pending', 'auto-draft')) ) { 
     123        if ( !empty($permalink) && ( isset($post->post_status) && !in_array($post->post_status, array('draft', 'pending', 'auto-draft')) ) ) { 
    118124                $unixtime = strtotime($post->post_date); 
     125                 
     126                $post_type_slug = isset( $post_type->rewrite['slug'] ) ? $post_type->rewrite['slug'] : ''; 
    119127 
    120128                $category = ''; 
    121                 if ( strpos($permalink, '%category%') !== false ) { 
     129                if ( strpos($permalink, '%category%') !== false && is_object_in_taxonomy( $post->post_type, 'category' ) ) { 
    122130                        $cats = get_the_category($post->ID); 
    123131                        if ( $cats ) { 
    124132                                usort($cats, '_usort_terms_by_ID'); // order by ID 
     
    139147                        $authordata = get_userdata($post->post_author); 
    140148                        $author = $authordata->user_nicename; 
    141149                } 
     150                 
     151                $hierarchical_name = $post_type->hierarchical ? get_page_uri( $post->ID ) : $post->post_name; 
    142152 
    143153                $date = explode(" ",date('Y m d H i s', $unixtime)); 
    144154                $rewritereplace = 
     
    154164                        $category, 
    155165                        $author, 
    156166                        $post->post_name, 
     167                        $post_type_slug, 
     168                        $hierarchical_name, 
    157169                ); 
    158170                $permalink = home_url( str_replace($rewritecode, $rewritereplace, $permalink) ); 
    159171                $permalink = user_trailingslashit($permalink, 'single'); 
    160172        } else { // if they're not using the fancy permalink option 
    161                 $permalink = home_url('?p=' . $post->ID); 
     173                if ( $post_type->query_var && ( isset($post->post_status) && !in_array($post->post_status, array('draft', 'pending', 'auto-draft')) ) ) 
     174                        $permalink = home_url( '?' . $post_type->query_var . '=' . $post->post_name ); 
     175                else 
     176                        $permalink = home_url('?p=' . $post->ID); 
    162177        } 
    163178        return apply_filters('post_link', $permalink, $post, $leavename); 
    164179} 
  • wp-includes/rewrite.php

     
    19791979                unset($this->feed_structure); 
    19801980                unset($this->comment_feed_structure); 
    19811981                $this->use_trailing_slashes = ( '/' == substr($this->permalink_structure, -1, 1) ); 
     1982                if( !did_action( 'wp_loaded' ) ) 
     1983                        add_action( 'wp_loaded', array( $this, 'set_post_type_rewrite_tag' ) ); 
    19821984 
    19831985                // Enable generic rules for pages if permalink structure doesn't begin with a wildcard. 
    19841986                if ( preg_match("/^[^%]*%(?:postname|category|tag|author)%/", $this->permalink_structure) ) 
     
    20472049                        $this->init(); 
    20482050                } 
    20492051        } 
     2052         
     2053        /** 
     2054         * Sets the rewrite tag for 'post type' 
     2055         *  
     2056         * Retrieves all publicly queryable custom post types and adds a rewrite tag 
     2057         * to handle their presence in the permalink. 
     2058         *  
     2059         * @since 3.1 
     2060         * @access public 
     2061         */ 
     2062         
     2063        function set_post_type_rewrite_tag(){ 
     2064                $queryable_post_types = get_post_types( array( 'publicly_queryable' => true, '_builtin' => false ), 'object' ); 
     2065                if( !empty($queryable_post_types) ){ 
     2066                        foreach( $queryable_post_types as $name => $args ) 
     2067                                $queryable_post_types[$name] = empty($args->rewrite) ? $name : $args->rewrite['slug']; 
     2068                } 
     2069                $this->add_rewrite_tag( '%post_type%', '('.implode('|',$queryable_post_types).')', 'post_type=' ); 
     2070        } 
    20502071 
    20512072        /** 
    20522073         * PHP4 Constructor - Calls init(), which runs setup. 
  • wp-includes/classes.php

     
    285285                        } 
    286286                } 
    287287 
    288                 // Limit publicly queried post_types to those that are publicly_queryable 
     288                /* Limit publicly queried post_types to those that are publicly_queryable, taking into account 
     289                the post type's name may not be the same as its rewrite slug */ 
    289290                if ( isset( $this->query_vars['post_type']) ) { 
    290                         $queryable_post_types =  get_post_types( array('publicly_queryable' => true) ); 
    291                         if ( ! in_array( $this->query_vars['post_type'], $queryable_post_types ) ) 
    292                                 unset( $this->query_vars['post_type'] ); 
     291                        $queryable_post_types =  get_post_types( array('publicly_queryable' => true), 'object' ); 
     292                        if ( ! in_array( $this->query_vars['post_type'], array_keys( $queryable_post_types ) ) ){ 
     293                                foreach( $queryable_post_types as $n => $args ) 
     294                                        if( !empty($args->rewrite) && $this->query_vars['post_type'] == $args->rewrite['slug'] ){ $this->query_vars['post_type'] = $n; } 
     295                                if( ! in_array( $this->query_vars['post_type'], array_keys( $queryable_post_types ) ) ) 
     296                                        unset( $this->query_vars['post_type'] ); 
     297                        } 
    293298                } 
    294299 
    295300                foreach ( (array) $this->private_query_vars as $var) {