Make WordPress Core


Ignore:
Timestamp:
10/06/2012 03:19:29 PM (14 years ago)
Author:
ryan
Message:

Better UI for doing "Page on Front".

Props SergeyBiryukov, lessbloat, nacin.

see #16379

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/wp-admin/includes/post.php

    r21949 r22127  
    10631063        $post = get_post($id);
    10641064
     1065        $context = isset( $_POST['context'] ) ? $_POST['context'] : get_current_screen()->id;
    10651066        list($permalink, $post_name) = get_sample_permalink($post->ID, $new_title, $new_slug);
    10661067
    … …  
    10741075
    10751076        if ( false === strpos($permalink, '%postname%') && false === strpos($permalink, '%pagename%') ) {
     1077                if ( 'options-reading' == $context )
     1078                        return '';
    10761079                $return = '<strong>' . __('Permalink:') . "</strong>\n" . '<span id="sample-permalink" tabindex="-1">' . $permalink . "</span>\n";
    10771080                if ( '' == get_option( 'permalink_structure' ) && current_user_can( 'manage_options' ) && !( 'page' == get_option('show_on_front') && $id == get_option('page_on_front') ) )
    … …  
    11021105        $display_link = str_replace(array('%pagename%','%postname%'), $post_name_html, $permalink);
    11031106        $view_link = str_replace(array('%pagename%','%postname%'), $post_name, $permalink);
    1104         $return =  '<strong>' . __('Permalink:') . "</strong>\n";
     1107        $return  = ( 'options-reading' == $context ) ? __( 'Located at' ) . "\n" : '<strong>' . __( 'Permalink:' ) . "</strong>\n";
    11051108        $return .= '<span id="sample-permalink" tabindex="-1">' . $display_link . "</span>\n";
    11061109        $return .= '&lrm;'; // Fix bi-directional text display defect in RTL languages.
    11071110        $return .= '<span id="edit-slug-buttons"><a href="#post_name" class="edit-slug button button-small hide-if-no-js" onclick="editPermalink(' . $id . '); return false;">' . __('Edit') . "</a></span>\n";
    11081111        $return .= '<span id="editable-post-name-full">' . $post_name . "</span>\n";
    1109         if ( isset($view_post) )
     1112        if ( isset( $view_post ) && 'options-reading' != $context )
    11101113                $return .= "<span id='view-post-btn'><a href='$view_link' class='button button-small'>$view_post</a></span>\n";
    11111114
    … …  
    13231326        return $url;
    13241327}
     1328
     1329/**
     1330 * Creates new pages to be set as a front page or a page for posts in Reading Settings.
     1331 *
     1332 * @todo Make sure we are doing adequate sanitization on success, and cleanup/reset on failure.
     1333 *
     1334 * @since 3.5.0
     1335 * @access private
     1336 */
     1337function _create_pages_for_reading_settings() {
     1338        // If we're saving the Reading Settings screen, intercept.
     1339        if ( ! isset( $_POST['show_on_front'] ) )
     1340                return;
     1341
     1342        // If a new front page was meant to be created, go forth and create it.
     1343        if ( isset( $_POST['page_on_front'] ) && 'new' == $_POST['page_on_front'] ) {
     1344                if ( ! current_user_can( 'create_posts', 'page' ) ) {
     1345                        $_POST['page_on_front'] = 0;
     1346                        $_POST['show_on_front'] = 'posts';
     1347                        add_settings_error( 'page_on_front', __( 'You are not allowed to create pages on this site.' ) );
     1348                }
     1349
     1350                $existing_page = get_page_by_title( stripslashes( $_POST['page_on_front_title'] ) );
     1351
     1352                // If page already exists and it's public, there's no need to create a new page
     1353                if ( $existing_page && 'publish' == $existing_page->post_status ) {
     1354                        $page_id = $existing_page->ID;
     1355                } else {
     1356                        $page_id = wp_insert_post( array(
     1357                                'post_title' => $_POST['page_on_front_title'],
     1358                                'post_type' => 'page',
     1359                                'post_status' => 'publish',
     1360                                'comment_status' => 'closed',
     1361                                'ping_status' => 'closed',
     1362                                // @todo Create some sort of a 'context' in postmeta so we know we created a page through these means.
     1363                                //       Consider then showing that context in the list table as a good-first-step.
     1364                        ), true );
     1365                }
     1366
     1367                // Make sure page_on_front is properly saved by options.php.
     1368                if ( is_wp_error( $page_id ) )
     1369                        $_POST['page_on_front'] = 0;
     1370                else
     1371                        $_POST['page_on_front'] = $page_id;
     1372        }
     1373
     1374        // If a page for posts was meant to be specified, update/create it.
     1375        if ( ! isset( $_POST['page_for_posts'] ) )
     1376                return;
     1377
     1378        $page_for_posts = (int) $_POST['page_for_posts'];
     1379        if ( ! $page_for_posts || ! $page = get_post( $page_for_posts, ARRAY_A ) ) {
     1380                $_POST['page_for_posts'] = 0;
     1381                return;
     1382        }
     1383
     1384        // @todo The UI (see @todo's in options-reading) should cover the next 3 conditionals,
     1385        //       which means we shouldn't need to bother with setting a settings error here.
     1386        //       However, we may wish to restore settings before bailing, beyond setting
     1387        //       page_for_posts to 0 (which we then expect to get cleaned up by options.php).
     1388        if ( 'page' != $page['post_type'] || ! current_user_can( 'edit_post', $page_for_posts ) ) {
     1389                $_POST['page_for_posts'] = 0;
     1390                return;
     1391        }
     1392
     1393        if ( 'publish' != $page['post_status'] && ! current_user_can( 'publish_post', $page_for_posts ) ) {
     1394                $_POST['page_for_posts'] = 0;
     1395                return;
     1396        }
     1397
     1398        $args = add_magic_quotes( $page );
     1399        $args['post_title']  = $_POST['page_for_posts_title'];
     1400        $args['post_name']   = $_POST['post_name'];
     1401        $args['post_status'] = 'publish';
     1402        if ( 'auto-draft' == $page['post_status'] ) {
     1403                $args['comment_status'] = 'closed';
     1404                $args['ping_status'] = 'closed';
     1405        }
     1406
     1407        $page_id = wp_insert_post( $args, true );
     1408        if ( is_wp_error( $page_id ) )
     1409                $_POST['page_for_posts'] = 0;
     1410}
     1411add_filter( 'admin_init', '_create_pages_for_reading_settings' );
Note: See TracChangeset for help on using the changeset viewer.