WordPress.org

Make WordPress Core

Ticket #14675: 14675.patch

File 14675.patch, 7.1 KB (added by johnpbloch, 8 years ago)

Refreshed Patch

  • wp-includes/classes.php

     
    287287
    288288                // Limit publicly queried post_types to those that are publicly_queryable
    289289                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'] );
     290                        $queryable_post_types =  get_post_types( array('publicly_queryable' => true), 'object' );
     291                        if ( ! in_array( $this->query_vars['post_type'], array_keys( $queryable_post_types ) ) ){
     292                                $post_type_match = false;
     293                                foreach( $queryable_post_types as $n => $args ){
     294                                        if( !empty( $args->rewrite ) && $this->query_vars['post_type'] == $args->rewrite['slug'] ){
     295                                                $this->query_vars['post_type'] = $n;
     296                                                $post_type_match = true;
     297                                                break;
     298                                        }
     299                                }
     300                                if( ! $post_type_match )
     301                                        unset( $this->query_vars['post_type'] );
     302                        }
    293303                }
    294304
    295305                foreach ( (array) $this->private_query_vars as $var) {
  • 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_' . $post->post_type . '%',
     106                '%' . $post->post_type . '%',
    93107        );
    94108
    95         if ( is_object($id) && isset($id->filter) && 'sample' == $id->filter ) {
    96                 $post = $id;
    97                 $sample = true;
     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        }
    102119
    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 
    115120        $permalink = apply_filters('pre_post_link', $permalink, $post, $leavename);
    116121
    117         if ( '' != $permalink && !in_array($post->post_status, array('draft', 'pending', 'auto-draft')) ) {
     122        if ( !empty($permalink) && ( isset($post->post_status) && !in_array($post->post_status, array('draft', 'pending', 'auto-draft')) ) ) {
     123       
     124                $post_type = get_post_type_object( $post->post_type );
     125               
    118126                $unixtime = strtotime($post->post_date);
     127               
     128                $post_type_slug = isset( $post_type->rewrite['slug'] ) ? $post_type->rewrite['slug'] : '';
    119129
    120130                $category = '';
    121                 if ( strpos($permalink, '%category%') !== false ) {
     131                if ( strpos($permalink, '%category%') !== false && is_object_in_taxonomy( $post->post_type, 'category' ) ) {
    122132                        $cats = get_the_category($post->ID);
    123133                        if ( $cats ) {
    124134                                usort($cats, '_usort_terms_by_ID'); // order by ID
     
    139149                        $authordata = get_userdata($post->post_author);
    140150                        $author = $authordata->user_nicename;
    141151                }
     152               
     153                $hierarchical_name = $post_type->hierarchical ? get_page_uri( $post->ID ) : $post->post_name;
    142154
    143155                $date = explode(" ",date('Y m d H i s', $unixtime));
    144156                $rewritereplace =
     
    154166                        $category,
    155167                        $author,
    156168                        $post->post_name,
     169                        $post_type_slug,
     170                        $hierarchical_name,
    157171                );
    158172                $permalink = home_url( str_replace($rewritecode, $rewritereplace, $permalink) );
    159173                $permalink = user_trailingslashit($permalink, 'single');
    160174        } else { // if they're not using the fancy permalink option
    161                 $permalink = home_url('?p=' . $post->ID);
     175                if( $post_type->query_var )
     176                        $permalink = home_url( '?' . $post_type->query_var . '=' . $post->post_name );
     177                else
     178                        $permalink = home_url('?p=' . $post->ID);
    162179        }
    163180        return apply_filters('post_link', $permalink, $post, $leavename);
    164181}
  • wp-includes/post.php

     
    866866                        $args->rewrite['slug'] = $post_type;
    867867                if ( !isset($args->rewrite['with_front']) )
    868868                        $args->rewrite['with_front'] = true;
     869                $wp_rewrite->add_rewrite_tag("%post_type_$post_type%", '(' . $args->rewrite['slug'] . ')', 'post_type=' );
    869870                if ( $args->hierarchical )
    870871                        $wp_rewrite->add_rewrite_tag("%$post_type%", '(.+?)', $args->query_var ? "{$args->query_var}=" : "post_type=$post_type&name=");
    871872                else
    872873                        $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);
     874                $wp_rewrite->add_permastruct($post_type, "%post_type_$post_type%/%$post_type%", $args->rewrite['with_front'], $args->permalink_epmask);
    874875        }
    875876
    876877        if ( $args->register_meta_box_cb )
  • wp-includes/rewrite.php

     
    19881988                unset($this->feed_structure);
    19891989                unset($this->comment_feed_structure);
    19901990                $this->use_trailing_slashes = ( '/' == substr($this->permalink_structure, -1, 1) );
     1991                if( !did_action( 'wp_loaded' ) )
     1992                        add_action( 'wp_loaded', array( $this, 'set_post_type_rewrite_tag' ) );
    19911993
    19921994                // Enable generic rules for pages if permalink structure doesn't begin with a wildcard.
    19931995                if ( preg_match("/^[^%]*%(?:postname|category|tag|author)%/", $this->permalink_structure) )
     
    20562058                        $this->init();
    20572059                }
    20582060        }
     2061       
     2062        /**
     2063         *
     2064         * Sets the rewrite tag for custom post types
     2065         *
     2066         * Retrieves all publicly queryable custom post types and adds a rewrite tag
     2067         * to handle their presence in the permalink.
     2068         */
     2069       
     2070        function set_post_type_rewrite_tag(){
     2071                $queryable_post_types = get_post_types( array( 'publicly_queryable' => true, '_builtin' => false ), 'object' );
     2072                if( !empty($queryable_post_types) ){
     2073                        foreach( $queryable_post_types as $name => $args ){
     2074                                $queryable_post_type = empty($args->rewrite) ? $name : $args->rewrite['slug'];
     2075                                $this->add_rewrite_tag( '%post_type_' . $name . '%', '(' . $queryable_post_type . ')', 'post_type=' );
     2076                        }
     2077                }
     2078        }
    20592079
    20602080        /**
    20612081         * PHP4 Constructor - Calls init(), which runs setup.