[ Index ]

PHP Cross Reference of WordPress

title

Body

[close]

/wp-admin/ -> edit-form-blocks.php (source)

   1  <?php
   2  /**
   3   * The block editor page.
   4   *
   5   * @since 5.0.0
   6   *
   7   * @package WordPress
   8   * @subpackage Administration
   9   */
  10  
  11  // Don't load directly.
  12  if ( ! defined( 'ABSPATH' ) ) {
  13      die( '-1' );
  14  }
  15  
  16  /**
  17   * @global string       $post_type
  18   * @global WP_Post_Type $post_type_object
  19   * @global WP_Post      $post             Global post object.
  20   * @global string       $title
  21   * @global array        $editor_styles
  22   * @global array        $wp_meta_boxes
  23   */
  24  global $post_type, $post_type_object, $post, $title, $editor_styles, $wp_meta_boxes;
  25  
  26  // Flag that we're loading the block editor.
  27  $current_screen = get_current_screen();
  28  $current_screen->is_block_editor( true );
  29  
  30  /*
  31   * Emoji replacement is disabled for now, until it plays nicely with React.
  32   */
  33  remove_action( 'admin_print_scripts', 'print_emoji_detection_script' );
  34  
  35  wp_enqueue_script( 'heartbeat' );
  36  wp_enqueue_script( 'wp-edit-post' );
  37  wp_enqueue_script( 'wp-format-library' );
  38  
  39  $rest_base = ! empty( $post_type_object->rest_base ) ? $post_type_object->rest_base : $post_type_object->name;
  40  
  41  // Preload common data.
  42  $preload_paths = array(
  43      '/',
  44      '/wp/v2/types?context=edit',
  45      '/wp/v2/taxonomies?per_page=-1&context=edit',
  46      '/wp/v2/themes?status=active',
  47      sprintf( '/wp/v2/%s/%s?context=edit', $rest_base, $post->ID ),
  48      sprintf( '/wp/v2/types/%s?context=edit', $post_type ),
  49      sprintf( '/wp/v2/users/me?post_type=%s&context=edit', $post_type ),
  50      array( '/wp/v2/media', 'OPTIONS' ),
  51      array( '/wp/v2/blocks', 'OPTIONS' ),
  52      sprintf( '/wp/v2/%s/%d/autosaves?context=edit', $rest_base, $post->ID ),
  53  );
  54  
  55  /**
  56   * Preload common data by specifying an array of REST API paths that will be preloaded.
  57   *
  58   * Filters the array of paths that will be preloaded.
  59   *
  60   * @since 5.0.0
  61   *
  62   * @param string[] $preload_paths Array of paths to preload.
  63   * @param WP_Post  $post          Post being edited.
  64   */
  65  $preload_paths = apply_filters( 'block_editor_preload_paths', $preload_paths, $post );
  66  
  67  /*
  68   * Ensure the global $post remains the same after API data is preloaded.
  69   * Because API preloading can call the_content and other filters, plugins
  70   * can unexpectedly modify $post.
  71   */
  72  $backup_global_post = $post;
  73  
  74  $preload_data = array_reduce(
  75      $preload_paths,
  76      'rest_preload_api_request',
  77      array()
  78  );
  79  
  80  // Restore the global $post as it was before API preloading.
  81  $post = $backup_global_post;
  82  
  83  wp_add_inline_script(
  84      'wp-api-fetch',
  85      sprintf( 'wp.apiFetch.use( wp.apiFetch.createPreloadingMiddleware( %s ) );', wp_json_encode( $preload_data ) ),
  86      'after'
  87  );
  88  
  89  wp_add_inline_script(
  90      'wp-blocks',
  91      sprintf( 'wp.blocks.setCategories( %s );', wp_json_encode( get_block_categories( $post ) ) ),
  92      'after'
  93  );
  94  
  95  /*
  96   * Assign initial edits, if applicable. These are not initially assigned to the persisted post,
  97   * but should be included in its save payload.
  98   */
  99  $initial_edits = null;
 100  $is_new_post   = false;
 101  if ( 'auto-draft' === $post->post_status ) {
 102      $is_new_post = true;
 103      // Override "(Auto Draft)" new post default title with empty string, or filtered value.
 104      $initial_edits = array(
 105          'title'   => $post->post_title,
 106          'content' => $post->post_content,
 107          'excerpt' => $post->post_excerpt,
 108      );
 109  }
 110  
 111  // Preload server-registered block schemas.
 112  wp_add_inline_script(
 113      'wp-blocks',
 114      'wp.blocks.unstable__bootstrapServerSideBlockDefinitions(' . wp_json_encode( get_block_editor_server_block_settings() ) . ');'
 115  );
 116  
 117  // Get admin url for handling meta boxes.
 118  $meta_box_url = admin_url( 'post.php' );
 119  $meta_box_url = add_query_arg(
 120      array(
 121          'post'                  => $post->ID,
 122          'action'                => 'edit',
 123          'meta-box-loader'       => true,
 124          'meta-box-loader-nonce' => wp_create_nonce( 'meta-box-loader' ),
 125      ),
 126      $meta_box_url
 127  );
 128  wp_localize_script( 'wp-editor', '_wpMetaBoxUrl', $meta_box_url );
 129  
 130  
 131  /*
 132   * Initialize the editor.
 133   */
 134  
 135  $align_wide       = get_theme_support( 'align-wide' );
 136  $color_palette    = current( (array) get_theme_support( 'editor-color-palette' ) );
 137  $font_sizes       = current( (array) get_theme_support( 'editor-font-sizes' ) );
 138  $gradient_presets = current( (array) get_theme_support( 'editor-gradient-presets' ) );
 139  
 140  /**
 141   * Filters the allowed block types for the editor, defaulting to true (all
 142   * block types supported).
 143   *
 144   * @since 5.0.0
 145   *
 146   * @param bool|array $allowed_block_types Array of block type slugs, or
 147   *                                        boolean to enable/disable all.
 148   * @param WP_Post    $post                The post resource data.
 149   */
 150  $allowed_block_types = apply_filters( 'allowed_block_types', true, $post );
 151  
 152  /*
 153   * Get all available templates for the post/page attributes meta-box.
 154   * The "Default template" array element should only be added if the array is
 155   * not empty so we do not trigger the template select element without any options
 156   * besides the default value.
 157   */
 158  $available_templates = wp_get_theme()->get_page_templates( get_post( $post->ID ) );
 159  $available_templates = ! empty( $available_templates ) ? array_merge(
 160      array(
 161          /** This filter is documented in wp-admin/includes/meta-boxes.php */
 162          '' => apply_filters( 'default_page_template_title', __( 'Default template' ), 'rest-api' ),
 163      ),
 164      $available_templates
 165  ) : $available_templates;
 166  
 167  // Media settings.
 168  $max_upload_size = wp_max_upload_size();
 169  if ( ! $max_upload_size ) {
 170      $max_upload_size = 0;
 171  }
 172  
 173  // Editor Styles.
 174  $styles = array(
 175      array(
 176          'css' => file_get_contents(
 177              ABSPATH . WPINC . '/css/dist/editor/editor-styles.css'
 178          ),
 179      ),
 180  );
 181  
 182  /* translators: Use this to specify the CSS font family for the default font. */
 183  $locale_font_family = esc_html_x( 'Noto Serif', 'CSS Font Family for Editor Font' );
 184  $styles[]           = array(
 185      'css' => "body { font-family: '$locale_font_family' }",
 186  );
 187  
 188  if ( $editor_styles && current_theme_supports( 'editor-styles' ) ) {
 189      foreach ( $editor_styles as $style ) {
 190          if ( preg_match( '~^(https?:)?//~', $style ) ) {
 191              $response = wp_remote_get( $style );
 192              if ( ! is_wp_error( $response ) ) {
 193                  $styles[] = array(
 194                      'css' => wp_remote_retrieve_body( $response ),
 195                  );
 196              }
 197          } else {
 198              $file = get_theme_file_path( $style );
 199              if ( is_file( $file ) ) {
 200                  $styles[] = array(
 201                      'css'     => file_get_contents( $file ),
 202                      'baseURL' => get_theme_file_uri( $style ),
 203                  );
 204              }
 205          }
 206      }
 207  }
 208  
 209  // Image sizes.
 210  
 211  /** This filter is documented in wp-admin/includes/media.php */
 212  $image_size_names = apply_filters(
 213      'image_size_names_choose',
 214      array(
 215          'thumbnail' => __( 'Thumbnail' ),
 216          'medium'    => __( 'Medium' ),
 217          'large'     => __( 'Large' ),
 218          'full'      => __( 'Full Size' ),
 219      )
 220  );
 221  
 222  $available_image_sizes = array();
 223  foreach ( $image_size_names as $image_size_slug => $image_size_name ) {
 224      $available_image_sizes[] = array(
 225          'slug' => $image_size_slug,
 226          'name' => $image_size_name,
 227      );
 228  }
 229  
 230  $image_dimensions = array();
 231  $all_sizes        = wp_get_registered_image_subsizes();
 232  foreach ( $available_image_sizes as $size ) {
 233      $key = $size['slug'];
 234      if ( isset( $all_sizes[ $key ] ) ) {
 235          $image_dimensions[ $key ] = $all_sizes[ $key ];
 236      }
 237  }
 238  
 239  // Lock settings.
 240  $user_id = wp_check_post_lock( $post->ID );
 241  if ( $user_id ) {
 242      $locked = false;
 243  
 244      /** This filter is documented in wp-admin/includes/post.php */
 245      if ( apply_filters( 'show_post_locked_dialog', true, $post, $user_id ) ) {
 246          $locked = true;
 247      }
 248  
 249      $user_details = null;
 250      if ( $locked ) {
 251          $user         = get_userdata( $user_id );
 252          $user_details = array(
 253              'name' => $user->display_name,
 254          );
 255          $avatar       = get_avatar_url( $user_id, array( 'size' => 64 ) );
 256      }
 257  
 258      $lock_details = array(
 259          'isLocked' => $locked,
 260          'user'     => $user_details,
 261      );
 262  } else {
 263      // Lock the post.
 264      $active_post_lock = wp_set_post_lock( $post->ID );
 265      if ( $active_post_lock ) {
 266          $active_post_lock = esc_attr( implode( ':', $active_post_lock ) );
 267      }
 268  
 269      $lock_details = array(
 270          'isLocked'       => false,
 271          'activePostLock' => $active_post_lock,
 272      );
 273  }
 274  
 275  /**
 276   * Filters the body placeholder text.
 277   *
 278   * @since 5.0.0
 279   *
 280   * @param string  $text Placeholder text. Default 'Start writing or type / to choose a block'.
 281   * @param WP_Post $post Post object.
 282   */
 283  $body_placeholder = apply_filters( 'write_your_story', __( 'Start writing or type / to choose a block' ), $post );
 284  
 285  $editor_settings = array(
 286      'alignWide'              => $align_wide,
 287      'availableTemplates'     => $available_templates,
 288      'allowedBlockTypes'      => $allowed_block_types,
 289      'disableCustomColors'    => get_theme_support( 'disable-custom-colors' ),
 290      'disableCustomFontSizes' => get_theme_support( 'disable-custom-font-sizes' ),
 291      'disableCustomGradients' => get_theme_support( 'disable-custom-gradients' ),
 292      'disablePostFormats'     => ! current_theme_supports( 'post-formats' ),
 293      /** This filter is documented in wp-admin/edit-form-advanced.php */
 294      'titlePlaceholder'       => apply_filters( 'enter_title_here', __( 'Add title' ), $post ),
 295      'bodyPlaceholder'        => $body_placeholder,
 296      'isRTL'                  => is_rtl(),
 297      'autosaveInterval'       => AUTOSAVE_INTERVAL,
 298      'maxUploadFileSize'      => $max_upload_size,
 299      'allowedMimeTypes'       => get_allowed_mime_types(),
 300      'styles'                 => $styles,
 301      'imageSizes'             => $available_image_sizes,
 302      'imageDimensions'        => $image_dimensions,
 303      'richEditingEnabled'     => user_can_richedit(),
 304      'postLock'               => $lock_details,
 305      'postLockUtils'          => array(
 306          'nonce'       => wp_create_nonce( 'lock-post_' . $post->ID ),
 307          'unlockNonce' => wp_create_nonce( 'update-post_' . $post->ID ),
 308          'ajaxUrl'     => admin_url( 'admin-ajax.php' ),
 309      ),
 310  
 311      // Whether or not to load the 'postcustom' meta box is stored as a user meta
 312      // field so that we're not always loading its assets.
 313      'enableCustomFields'     => (bool) get_user_meta( get_current_user_id(), 'enable_custom_fields', true ),
 314  );
 315  
 316  $autosave = wp_get_post_autosave( $post_ID );
 317  if ( $autosave ) {
 318      if ( mysql2date( 'U', $autosave->post_modified_gmt, false ) > mysql2date( 'U', $post->post_modified_gmt, false ) ) {
 319          $editor_settings['autosave'] = array(
 320              'editLink' => get_edit_post_link( $autosave->ID ),
 321          );
 322      } else {
 323          wp_delete_post_revision( $autosave->ID );
 324      }
 325  }
 326  
 327  if ( false !== $color_palette ) {
 328      $editor_settings['colors'] = $color_palette;
 329  }
 330  
 331  if ( false !== $font_sizes ) {
 332      $editor_settings['fontSizes'] = $font_sizes;
 333  }
 334  
 335  if ( false !== $gradient_presets ) {
 336      $editor_settings['gradients'] = $gradient_presets;
 337  }
 338  
 339  if ( ! empty( $post_type_object->template ) ) {
 340      $editor_settings['template']     = $post_type_object->template;
 341      $editor_settings['templateLock'] = ! empty( $post_type_object->template_lock ) ? $post_type_object->template_lock : false;
 342  }
 343  
 344  // If there's no template set on a new post, use the post format, instead.
 345  if ( $is_new_post && ! isset( $editor_settings['template'] ) && 'post' === $post->post_type ) {
 346      $post_format = get_post_format( $post );
 347      if ( in_array( $post_format, array( 'audio', 'gallery', 'image', 'quote', 'video' ), true ) ) {
 348          $editor_settings['template'] = array( array( "core/$post_format" ) );
 349      }
 350  }
 351  
 352  /**
 353   * Scripts
 354   */
 355  wp_enqueue_media(
 356      array(
 357          'post' => $post->ID,
 358      )
 359  );
 360  wp_tinymce_inline_scripts();
 361  wp_enqueue_editor();
 362  
 363  /**
 364   * Styles
 365   */
 366  wp_enqueue_style( 'wp-edit-post' );
 367  wp_enqueue_style( 'wp-format-library' );
 368  
 369  /**
 370   * Fires after block assets have been enqueued for the editing interface.
 371   *
 372   * Call `add_action` on any hook before 'admin_enqueue_scripts'.
 373   *
 374   * In the function call you supply, simply use `wp_enqueue_script` and
 375   * `wp_enqueue_style` to add your functionality to the block editor.
 376   *
 377   * @since 5.0.0
 378   */
 379  do_action( 'enqueue_block_editor_assets' );
 380  
 381  // In order to duplicate classic meta box behaviour, we need to run the classic meta box actions.
 382  require_once ABSPATH . 'wp-admin/includes/meta-boxes.php';
 383  register_and_do_post_meta_boxes( $post );
 384  
 385  // Check if the Custom Fields meta box has been removed at some point.
 386  $core_meta_boxes = $wp_meta_boxes[ $current_screen->id ]['normal']['core'];
 387  if ( ! isset( $core_meta_boxes['postcustom'] ) || ! $core_meta_boxes['postcustom'] ) {
 388      unset( $editor_settings['enableCustomFields'] );
 389  }
 390  
 391  /**
 392   * Filters the settings to pass to the block editor.
 393   *
 394   * @since 5.0.0
 395   *
 396   * @param array   $editor_settings Default editor settings.
 397   * @param WP_Post $post            Post being edited.
 398   */
 399  $editor_settings = apply_filters( 'block_editor_settings', $editor_settings, $post );
 400  
 401  $init_script = <<<JS
 402  ( function() {
 403      window._wpLoadBlockEditor = new Promise( function( resolve ) {
 404          wp.domReady( function() {
 405              resolve( wp.editPost.initializeEditor( 'editor', "%s", %d, %s, %s ) );
 406          } );
 407      } );
 408  } )();
 409  JS;
 410  
 411  $script = sprintf(
 412      $init_script,
 413      $post->post_type,
 414      $post->ID,
 415      wp_json_encode( $editor_settings ),
 416      wp_json_encode( $initial_edits )
 417  );
 418  wp_add_inline_script( 'wp-edit-post', $script );
 419  
 420  require_once ABSPATH . 'wp-admin/admin-header.php';
 421  ?>
 422  
 423  <div class="block-editor">
 424      <h1 class="screen-reader-text hide-if-no-js"><?php echo esc_html( $title ); ?></h1>
 425      <div id="editor" class="block-editor__container hide-if-no-js"></div>
 426      <div id="metaboxes" class="hidden">
 427          <?php the_block_editor_meta_boxes(); ?>
 428      </div>
 429  
 430      <?php // JavaScript is disabled. ?>
 431      <div class="wrap hide-if-js block-editor-no-js">
 432          <h1 class="wp-heading-inline"><?php echo esc_html( $title ); ?></h1>
 433          <div class="notice notice-error notice-alt">
 434              <p>
 435                  <?php
 436                      $message = sprintf(
 437                          /* translators: %s: A link to install the Classic Editor plugin. */
 438                          __( 'The block editor requires JavaScript. Please enable JavaScript in your browser settings, or try the <a href="%s">Classic Editor plugin</a>.' ),
 439                          esc_url( wp_nonce_url( self_admin_url( 'plugin-install.php?tab=favorites&user=wordpressdotorg&save=0' ), 'save_wporg_username_' . get_current_user_id() ) )
 440                      );
 441  
 442                      /**
 443                       * Filters the message displayed in the block editor interface when JavaScript is
 444                       * not enabled in the browser.
 445                       *
 446                       * @since 5.0.3
 447                       *
 448                       * @param string  $message The message being displayed.
 449                       * @param WP_Post $post    The post being edited.
 450                       */
 451                      echo apply_filters( 'block_editor_no_javascript_message', $message, $post );
 452                      ?>
 453              </p>
 454          </div>
 455      </div>
 456  </div>


Generated: Mon Apr 6 01:00:03 2020 Cross-referenced by PHPXref 0.7.1