WordPress.org

Make WordPress Core

Ticket #14675: patch.patch

File patch.patch, 7.0 KB (added by johnpbloch, 8 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) {