WordPress.org

Make WordPress Core

Ticket #10470: page_for_posts.patch

File page_for_posts.patch, 10.6 KB (added by mch, 9 years ago)
  • wp-includes/post.php

     
    11581158                        update_option('show_on_front', 'posts');
    11591159                        delete_option('page_on_front');
    11601160                }
    1161                 if ( get_option('page_for_posts') == $postid ) {
    1162                         delete_option('page_for_posts');
    1163                 }
     1161                delete_post_from_page_for_posts($postid);
    11641162
    11651163                // Point children of this page to its parent, also clean the cache of affected children
    11661164                $children_query = $wpdb->prepare("SELECT * FROM $wpdb->posts WHERE post_parent = %d AND post_type='page'", $postid);
  • wp-includes/functions.php

     
    366366
    367367        return apply_filters( 'option_' . $setting, maybe_unserialize( $value ) );
    368368}
     369/**
     370 * Deletes the POST from pages for posts array
     371 *
     372 * @package WordPress
     373 * @subpackage Option
     374 * @uses get_option_page_for_posts() for checking whether the page is for posts and then for storing the value
     375 * @uses update_option() Calls 'page_for_posts' to update the option with serialize(array)
     376 * @uses delete_option() Calls 'page_for_posts' with the option name value.
     377 *
     378 * @param string $postid ID of post which is deleted
     379 */
     380function delete_post_from_page_for_posts($postid) {
     381        $opt = get_option_page_for_posts();
     382        if (array_key_exists($postid, $opt)) {
     383                unset ($opt[$postid]);
     384        }
     385        if (count($opt) > 0) {
     386                update_option('page_for_posts', serialize($opt));
     387        } else {
     388                delete_option('page_for_posts');
     389        }
     390}
     391/**
     392 * returns whether the page is page for posts
     393 * @package WordPress
     394 * @subpackage Option
     395 * @uses get_option_page_for_posts() to obtain the array map
     396 *
     397 * @param string $postid id of the post
     398 * @return bool true if is page for posts
     399 */
     400function is_get_option_page_for_posts($postid) {
     401    return array_key_exists($postid, get_option_page_for_posts());
     402}
     403/**
     404 * used for getting array mapping for pages for posts
     405 *
     406 * @package WordPress
     407 * @subpackage Option
     408 * @uses get_option() retrieves 'page_for_posts' option
     409 * @return array filled with saved settings or empty array
     410 */
     411function get_option_page_for_posts() {
     412        $opt = get_option('page_for_posts');
     413        if (is_array($opt)) {
     414                return $opt;
     415        }
     416        $opt = unserialize($opt);
     417        if (is_array($opt)) {
     418                return $opt;
     419        }
     420        return array ();
     421}
     422/**
     423 * returns category ID for desired post - if available
     424 * @package WordPress
     425 * @subpackage Option
     426 * @uses get_option_page_for_posts() to get array map
     427 *
     428 * @param int $postid id of post
     429 * @return mixed empty or id of category
     430 */
     431function get_option_page_for_posts_category($postid) {
     432        $opts = get_option_page_for_posts();
     433        if (array_key_exists($postid, $opts))
     434                return $opts[$postid];
     435        return '';
     436}
    369437
    370438/**
    371439 * Protect WordPress special option from being modified.
  • wp-includes/query.php

     
    10781078         * @var bool
    10791079         */
    10801080        var $is_posts_page = false;
    1081 
    10821081        /**
     1082         * Set to ID of posts page.
     1083         *
     1084         * Basically, the homepage if the option isn't set for the static homepage.
     1085         *
     1086         * @since 2.9.0
     1087         * @access public
     1088         * @var bool
     1089         */
     1090        var $post_page_id = -1;
     1091        /**
    10831092         * Resets query flags to false.
    10841093         *
    10851094         * The query flags are what page info WordPress was able to figure out.
     
    11121121                $this->is_singular = false;
    11131122                $this->is_robots = false;
    11141123                $this->is_posts_page = false;
     1124                $this->post_page_id = -1;
    11151125        }
    11161126
    11171127        /**
     
    14711481                        else
    14721482                                unset($this->queried_object);
    14731483
    1474                         if  ( 'page' == get_option('show_on_front') && isset($this->queried_object_id) && $this->queried_object_id == get_option('page_for_posts') ) {
     1484                        if  ( 'page' == get_option('show_on_front') && isset($this->queried_object_id) && is_get_option_page_for_posts($this->queried_object_id)) {
    14751485                                $this->is_page = false;
    14761486                                $this->is_home = true;
    14771487                                $this->is_posts_page = true;
     1488                                $this->post_page_id = $this->queried_object_id; 
    14781489                        }
    14791490                }
    14801491
    14811492                if ( $qv['page_id'] ) {
    1482                         if  ( 'page' == get_option('show_on_front') && $qv['page_id'] == get_option('page_for_posts') ) {
     1493                        if  ( 'page' == get_option('show_on_front') && is_get_option_page_for_posts($qv['page_id'])) {
    14831494                                $this->is_page = false;
    14841495                                $this->is_home = true;
    14851496                                $this->is_posts_page = true;
     1497                                $this->post_page_id = $qv['page_id'];
    14861498                        }
    14871499                }
    14881500
     
    16861698                                        $reqpage = 0;
    16871699                        }
    16881700
    1689                         $page_for_posts = get_option('page_for_posts');
    1690                         if  ( ('page' != get_option('show_on_front') ) ||  empty($page_for_posts) || ( $reqpage != $page_for_posts ) ) {
     1701                        if  ( ('page' != get_option('show_on_front') ) ||  !is_get_option_page_for_posts($reqpage)) {
    16911702                                $q['pagename'] = str_replace('%2F', '/', urlencode(urldecode($q['pagename'])));
    16921703                                $page_paths = '/' . trim($q['pagename'], '/');
    16931704                                $q['pagename'] = sanitize_title(basename($page_paths));
     
    17331744                        $where .= $wpdb->prepare( " AND $wpdb->posts.post_parent = %d ", $q['post_parent'] );
    17341745
    17351746                if ( $q['page_id'] ) {
    1736                         if  ( ('page' != get_option('show_on_front') ) || ( $q['page_id'] != get_option('page_for_posts') ) ) {
     1747                        if  ( ('page' != get_option('show_on_front') ) || ( !is_get_option_page_for_posts($q['page_id'])) ) {
    17371748                                $q['p'] = $q['page_id'];
    17381749                                $where = " AND {$wpdb->posts}.ID = " . $q['page_id'];
    17391750                        }
     
    20112022                                $q['author'] = $q['author']->ID;
    20122023                        $whichauthor .= " AND ($wpdb->posts.post_author = ".absint($q['author']).')';
    20132024                }
    2014 
     2025                // category post page
     2026                if($this->is_posts_page && $this->post_page_id >0){
     2027                        $join.= " INNER JOIN $wpdb->term_relationships ON ($wpdb->posts.ID = $wpdb->term_relationships.object_id) INNER JOIN $wpdb->term_taxonomy ON ($wpdb->term_relationships.term_taxonomy_id = $wpdb->term_taxonomy.term_taxonomy_id) ";
     2028                        $whichcat.= " AND $wpdb->term_taxonomy.taxonomy = 'category' ";
     2029                        $whichcat.= "AND $wpdb->term_taxonomy.term_id = ".get_option_page_for_posts_category($this->post_page_id)."";
     2030                        $groupby = "{$wpdb->posts}.ID";
     2031                }
    20152032                // MIME-Type stuff for attachment browsing
    20162033
    20172034                if ( isset($q['post_mime_type']) && '' != $q['post_mime_type'] )
     
    25332550
    25342551                $this->queried_object = NULL;
    25352552                $this->queried_object_id = 0;
    2536 
    25372553                if ($this->is_category) {
    25382554                        $cat = $this->get('cat');
    25392555                        $category = &get_category($cat);
     
    25582574                        $this->queried_object = $term;
    25592575                        $this->queried_object_id = $term->term_id;
    25602576                } else if ($this->is_posts_page) {
    2561                         $this->queried_object = & get_page(get_option('page_for_posts'));
     2577                        $this->queried_object = & get_page($this->post_page_id);
    25622578                        $this->queried_object_id = (int) $this->queried_object->ID;
    25632579                } else if ($this->is_single) {
    25642580                        $this->queried_object = $this->post;
  • wp-includes/classes.php

     
    11811181                                $css_class[] = 'current_page_item';
    11821182                        elseif ( $_current_page && $page->ID == $_current_page->post_parent )
    11831183                                $css_class[] = 'current_page_parent';
    1184                 } elseif ( $page->ID == get_option('page_for_posts') ) {
     1184                } elseif (is_get_option_page_for_posts($page->ID)) {
    11851185                        $css_class[] = 'current_page_parent';
    11861186                }
    11871187
  • wp-admin/options.php

     
    6666                if ( !empty($_POST['time_format']) && isset($_POST['time_format_custom']) && '\c\u\s\t\o\m' == stripslashes( $_POST['time_format'] ) )
    6767                        $_POST['time_format'] = $_POST['time_format_custom'];
    6868        }
    69 
     69$modifiedpost = $_POST;
     70        if('reading'==$option_page){
     71                $opts =  array();
     72                //page_for_posts_cat_-1
     73                foreach($_POST as $k=>$v){
     74                        $pos = strpos($k,'page_for_posts_');
     75                        if($pos===0){
     76                                if(''==$v) continue;
     77                                $id = substr($k,strlen('page_for_posts_'));
     78                                $opts[$v] = $_POST['page_for_postscat_'.$id];
     79                        }
     80                }
     81                $modifiedpost['page_for_posts'] = serialize($opts);
     82        }
    7083        if ( $options ) {
    7184                foreach ( $options as $option ) {
    7285                        $option = trim($option);
    7386                        $value = null;
    74                         if ( isset($_POST[$option]) )
    75                                 $value = $_POST[$option];
     87                        if ( isset($modifiedpost[$option]) )
     88                                $value = $modifiedpost[$option];
    7689                        if ( !is_array($value) ) $value = trim($value);
    7790                        $value = stripslashes_deep($value);
    7891                        update_option($option, $value);
    7992                }
    8093        }
    81 
    8294        $goback = add_query_arg( 'updated', 'true', wp_get_referer() );
    8395        wp_redirect( $goback );
    8496        break;
  • wp-admin/options-reading.php

     
    3939        </p>
    4040<ul>
    4141        <li><?php printf("<label for='page_on_front'>".__('Front page: %s')."</label>", wp_dropdown_pages("name=page_on_front&echo=0&show_option_none=".__('- Select -')."&selected=" . get_option('page_on_front'))); ?></li>
    42         <li><?php printf("<label for='page_for_posts'>".__('Posts page: %s')."</label>", wp_dropdown_pages("name=page_for_posts&echo=0&show_option_none=".__('- Select -')."&selected=" . get_option('page_for_posts'))); ?></li>
     42        <?
     43        $pages = get_option_page_for_posts();
     44        foreach($pages as $id=>$cat){
     45                $optcat=array('name'=>'page_for_postscat_'.$id,'echo'=>0,'hide_empty' => 0, 'orderby' => 'name', 'hierarchical' => 1
     46                , 'selected'=>$cat);
     47                $optpag = array('name'=>'page_for_posts_'.$id,'echo'=>0,
     48'show_option_none'=>__('- None -'),'selected'=>$id);
     49                $sel = wp_dropdown_pages($optpag);
     50                $catsel = wp_dropdown_categories($optcat);
     51                printf("<li><label for='page_for_posts".$id."'>".__('Posts page: %s Category : %s')."</label></li>", $sel, $catsel);
     52        }
     53                $optcat=array('echo'=>0,'hide_empty' => 0, 'name'=>'page_for_postscat_-1', 'orderby' => 'name', 'hierarchical' => 1, 'selected'=>-1);
     54                $optpag = array('name'=>'page_for_posts_-1','echo'=>0,
     55'show_option_none'=>__('- Add -'),'selected'=>-1);
     56                $sel = wp_dropdown_pages($optpag);
     57                $catsel = wp_dropdown_categories($optcat);
     58                printf("<li><label for='page_for_posts%s'>".__('Posts page: %s Category : %s')."</label></li>", -1, $sel, $catsel);
     59?>
    4360</ul>
    44 <?php if ( 'page' == get_option('show_on_front') && get_option('page_for_posts') == get_option('page_on_front') ) : ?>
     61<?php if ( 'page' == get_option('show_on_front') && is_get_option_page_for_posts(get_option('page_on_front') )) : ?>
    4562<div id="front-page-warning" class="updated fade-ff0000">
    4663        <p>
    4764                <?php _e('<strong>Warning:</strong> these pages should not be the same!'); ?>