[ 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 = clone $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  $custom_line_height = get_theme_support( 'custom-line-height' );
 140  $custom_units       = get_theme_support( 'custom-units' );
 141  
 142  /**
 143   * Filters the allowed block types for the editor, defaulting to true (all
 144   * block types supported).
 145   *
 146   * @since 5.0.0
 147   *
 148   * @param bool|array $allowed_block_types Array of block type slugs, or
 149   *                                        boolean to enable/disable all.
 150   * @param WP_Post    $post                The post resource data.
 151   */
 152  $allowed_block_types = apply_filters( 'allowed_block_types', true, $post );
 153  
 154  /*
 155   * Get all available templates for the post/page attributes meta-box.
 156   * The "Default template" array element should only be added if the array is
 157   * not empty so we do not trigger the template select element without any options
 158   * besides the default value.
 159   */
 160  $available_templates = wp_get_theme()->get_page_templates( get_post( $post->ID ) );
 161  $available_templates = ! empty( $available_templates ) ? array_merge(
 162      array(
 163          /** This filter is documented in wp-admin/includes/meta-boxes.php */
 164          '' => apply_filters( 'default_page_template_title', __( 'Default template' ), 'rest-api' ),
 165      ),
 166      $available_templates
 167  ) : $available_templates;
 168  
 169  // Media settings.
 170  $max_upload_size = wp_max_upload_size();
 171  if ( ! $max_upload_size ) {
 172      $max_upload_size = 0;
 173  }
 174  
 175  // Editor Styles.
 176  $styles = array(
 177      array(
 178          'css' => file_get_contents(
 179              ABSPATH . WPINC . '/css/dist/editor/editor-styles.css'
 180          ),
 181      ),
 182  );
 183  
 184  /* translators: Use this to specify the CSS font family for the default font. */
 185  $locale_font_family = esc_html_x( 'Noto Serif', 'CSS Font Family for Editor Font' );
 186  $styles[]           = array(
 187      'css' => "body { font-family: '$locale_font_family' }",
 188  );
 189  
 190  if ( $editor_styles && current_theme_supports( 'editor-styles' ) ) {
 191      foreach ( $editor_styles as $style ) {
 192          if ( preg_match( '~^(https?:)?//~', $style ) ) {
 193              $response = wp_remote_get( $style );
 194              if ( ! is_wp_error( $response ) ) {
 195                  $styles[] = array(
 196                      'css' => wp_remote_retrieve_body( $response ),
 197                  );
 198              }
 199          } else {
 200              $file = get_theme_file_path( $style );
 201              if ( is_file( $file ) ) {
 202                  $styles[] = array(
 203                      'css'     => file_get_contents( $file ),
 204                      'baseURL' => get_theme_file_uri( $style ),
 205                  );
 206              }
 207          }
 208      }
 209  }
 210  
 211  // Image sizes.
 212  
 213  /** This filter is documented in wp-admin/includes/media.php */
 214  $image_size_names = apply_filters(
 215      'image_size_names_choose',
 216      array(
 217          'thumbnail' => __( 'Thumbnail' ),
 218          'medium'    => __( 'Medium' ),
 219          'large'     => __( 'Large' ),
 220          'full'      => __( 'Full Size' ),
 221      )
 222  );
 223  
 224  $available_image_sizes = array();
 225  foreach ( $image_size_names as $image_size_slug => $image_size_name ) {
 226      $available_image_sizes[] = array(
 227          'slug' => $image_size_slug,
 228          'name' => $image_size_name,
 229      );
 230  }
 231  
 232  $image_dimensions = array();
 233  $all_sizes        = wp_get_registered_image_subsizes();
 234  foreach ( $available_image_sizes as $size ) {
 235      $key = $size['slug'];
 236      if ( isset( $all_sizes[ $key ] ) ) {
 237          $image_dimensions[ $key ] = $all_sizes[ $key ];
 238      }
 239  }
 240  
 241  // Lock settings.
 242  $user_id = wp_check_post_lock( $post->ID );
 243  if ( $user_id ) {
 244      $locked = false;
 245  
 246      /** This filter is documented in wp-admin/includes/post.php */
 247      if ( apply_filters( 'show_post_locked_dialog', true, $post, $user_id ) ) {
 248          $locked = true;
 249      }
 250  
 251      $user_details = null;
 252      if ( $locked ) {
 253          $user         = get_userdata( $user_id );
 254          $user_details = array(
 255              'name' => $user->display_name,
 256          );
 257          $avatar       = get_avatar_url( $user_id, array( 'size' => 64 ) );
 258      }
 259  
 260      $lock_details = array(
 261          'isLocked' => $locked,
 262          'user'     => $user_details,
 263      );
 264  } else {
 265      // Lock the post.
 266      $active_post_lock = wp_set_post_lock( $post->ID );
 267      if ( $active_post_lock ) {
 268          $active_post_lock = esc_attr( implode( ':', $active_post_lock ) );
 269      }
 270  
 271      $lock_details = array(
 272          'isLocked'       => false,
 273          'activePostLock' => $active_post_lock,
 274      );
 275  }
 276  
 277  /**
 278   * Filters the body placeholder text.
 279   *
 280   * @since 5.0.0
 281   *
 282   * @param string  $text Placeholder text. Default 'Start writing or type / to choose a block'.
 283   * @param WP_Post $post Post object.
 284   */
 285  $body_placeholder = apply_filters( 'write_your_story', __( 'Start writing or type / to choose a block' ), $post );
 286  
 287  $editor_settings = array(
 288      'alignWide'                            => $align_wide,
 289      'availableTemplates'                   => $available_templates,
 290      'allowedBlockTypes'                    => $allowed_block_types,
 291      'disableCustomColors'                  => get_theme_support( 'disable-custom-colors' ),
 292      'disableCustomFontSizes'               => get_theme_support( 'disable-custom-font-sizes' ),
 293      'disableCustomGradients'               => get_theme_support( 'disable-custom-gradients' ),
 294      'disablePostFormats'                   => ! current_theme_supports( 'post-formats' ),
 295      /** This filter is documented in wp-admin/edit-form-advanced.php */
 296      'titlePlaceholder'                     => apply_filters( 'enter_title_here', __( 'Add title' ), $post ),
 297      'bodyPlaceholder'                      => $body_placeholder,
 298      'isRTL'                                => is_rtl(),
 299      'autosaveInterval'                     => AUTOSAVE_INTERVAL,
 300      'maxUploadFileSize'                    => $max_upload_size,
 301      'allowedMimeTypes'                     => get_allowed_mime_types(),
 302      'styles'                               => $styles,
 303      'imageSizes'                           => $available_image_sizes,
 304      'imageDimensions'                      => $image_dimensions,
 305      'richEditingEnabled'                   => user_can_richedit(),
 306      'postLock'                             => $lock_details,
 307      'postLockUtils'                        => array(
 308          'nonce'       => wp_create_nonce( 'lock-post_' . $post->ID ),
 309          'unlockNonce' => wp_create_nonce( 'update-post_' . $post->ID ),
 310          'ajaxUrl'     => admin_url( 'admin-ajax.php' ),
 311      ),
 312      '__experimentalBlockPatterns'          => WP_Block_Patterns_Registry::get_instance()->get_all_registered(),
 313      '__experimentalBlockPatternCategories' => WP_Block_Pattern_Categories_Registry::get_instance()->get_all_registered(),
 314  
 315      // Whether or not to load the 'postcustom' meta box is stored as a user meta
 316      // field so that we're not always loading its assets.
 317      'enableCustomFields'                   => (bool) get_user_meta( get_current_user_id(), 'enable_custom_fields', true ),
 318      'enableCustomLineHeight'               => $custom_line_height,
 319      'enableCustomUnits'                    => $custom_units,
 320  );
 321  
 322  $autosave = wp_get_post_autosave( $post_ID );
 323  if ( $autosave ) {
 324      if ( mysql2date( 'U', $autosave->post_modified_gmt, false ) > mysql2date( 'U', $post->post_modified_gmt, false ) ) {
 325          $editor_settings['autosave'] = array(
 326              'editLink' => get_edit_post_link( $autosave->ID ),
 327          );
 328      } else {
 329          wp_delete_post_revision( $autosave->ID );
 330      }
 331  }
 332  
 333  if ( false !== $color_palette ) {
 334      $editor_settings['colors'] = $color_palette;
 335  }
 336  
 337  if ( false !== $font_sizes ) {
 338      $editor_settings['fontSizes'] = $font_sizes;
 339  }
 340  
 341  if ( false !== $gradient_presets ) {
 342      $editor_settings['gradients'] = $gradient_presets;
 343  }
 344  
 345  if ( ! empty( $post_type_object->template ) ) {
 346      $editor_settings['template']     = $post_type_object->template;
 347      $editor_settings['templateLock'] = ! empty( $post_type_object->template_lock ) ? $post_type_object->template_lock : false;
 348  }
 349  
 350  // If there's no template set on a new post, use the post format, instead.
 351  if ( $is_new_post && ! isset( $editor_settings['template'] ) && 'post' === $post->post_type ) {
 352      $post_format = get_post_format( $post );
 353      if ( in_array( $post_format, array( 'audio', 'gallery', 'image', 'quote', 'video' ), true ) ) {
 354          $editor_settings['template'] = array( array( "core/$post_format" ) );
 355      }
 356  }
 357  
 358  /**
 359   * Scripts
 360   */
 361  wp_enqueue_media(
 362      array(
 363          'post' => $post->ID,
 364      )
 365  );
 366  wp_tinymce_inline_scripts();
 367  wp_enqueue_editor();
 368  
 369  
 370  /**
 371   * Styles
 372   */
 373  wp_enqueue_style( 'wp-edit-post' );
 374  wp_enqueue_style( 'wp-format-library' );
 375  
 376  /**
 377   * Fires after block assets have been enqueued for the editing interface.
 378   *
 379   * Call `add_action` on any hook before 'admin_enqueue_scripts'.
 380   *
 381   * In the function call you supply, simply use `wp_enqueue_script` and
 382   * `wp_enqueue_style` to add your functionality to the block editor.
 383   *
 384   * @since 5.0.0
 385   */
 386  do_action( 'enqueue_block_editor_assets' );
 387  
 388  // In order to duplicate classic meta box behaviour, we need to run the classic meta box actions.
 389  require_once ABSPATH . 'wp-admin/includes/meta-boxes.php';
 390  register_and_do_post_meta_boxes( $post );
 391  
 392  // Check if the Custom Fields meta box has been removed at some point.
 393  $core_meta_boxes = $wp_meta_boxes[ $current_screen->id ]['normal']['core'];
 394  if ( ! isset( $core_meta_boxes['postcustom'] ) || ! $core_meta_boxes['postcustom'] ) {
 395      unset( $editor_settings['enableCustomFields'] );
 396  }
 397  
 398  /**
 399   * Filters the settings to pass to the block editor.
 400   *
 401   * @since 5.0.0
 402   *
 403   * @param array   $editor_settings Default editor settings.
 404   * @param WP_Post $post            Post being edited.
 405   */
 406  $editor_settings = apply_filters( 'block_editor_settings', $editor_settings, $post );
 407  
 408  $init_script = <<<JS
 409  ( function() {
 410      window._wpLoadBlockEditor = new Promise( function( resolve ) {
 411          wp.domReady( function() {
 412              resolve( wp.editPost.initializeEditor( 'editor', "%s", %d, %s, %s ) );
 413          } );
 414      } );
 415  } )();
 416  JS;
 417  
 418  $script = sprintf(
 419      $init_script,
 420      $post->post_type,
 421      $post->ID,
 422      wp_json_encode( $editor_settings ),
 423      wp_json_encode( $initial_edits )
 424  );
 425  wp_add_inline_script( 'wp-edit-post', $script );
 426  
 427  require_once ABSPATH . 'wp-admin/admin-header.php';
 428  ?>
 429  
 430  <div class="block-editor">
 431      <h1 class="screen-reader-text hide-if-no-js"><?php echo esc_html( $title ); ?></h1>
 432      <div id="editor" class="block-editor__container hide-if-no-js"></div>
 433      <div id="metaboxes" class="hidden">
 434          <?php the_block_editor_meta_boxes(); ?>
 435      </div>
 436  
 437      <?php // JavaScript is disabled. ?>
 438      <div class="wrap hide-if-js block-editor-no-js">
 439          <h1 class="wp-heading-inline"><?php echo esc_html( $title ); ?></h1>
 440          <div class="notice notice-error notice-alt">
 441              <p>
 442                  <?php
 443                      $message = sprintf(
 444                          /* translators: %s: A link to install the Classic Editor plugin. */
 445                          __( 'The block editor requires JavaScript. Please enable JavaScript in your browser settings, or try the <a href="%s">Classic Editor plugin</a>.' ),
 446                          esc_url( wp_nonce_url( self_admin_url( 'plugin-install.php?tab=favorites&user=wordpressdotorg&save=0' ), 'save_wporg_username_' . get_current_user_id() ) )
 447                      );
 448  
 449                      /**
 450                       * Filters the message displayed in the block editor interface when JavaScript is
 451                       * not enabled in the browser.
 452                       *
 453                       * @since 5.0.3
 454                       *
 455                       * @param string  $message The message being displayed.
 456                       * @param WP_Post $post    The post being edited.
 457                       */
 458                      echo apply_filters( 'block_editor_no_javascript_message', $message, $post );
 459                      ?>
 460              </p>
 461          </div>
 462      </div>
 463  </div>


Generated: Sat Aug 8 01:00:03 2020 Cross-referenced by PHPXref 0.7.1