404page – your smart custom 404 error page - Version 9

Version Description

Download this release

Release Info

Developer petersplugins
Plugin Icon 128x128 404page – your smart custom 404 error page
Version 9
Comparing to
See all releases

Code changes from version 8 to 9

404page.php CHANGED
@@ -9,7 +9,7 @@
9
  * Plugin Name: 404page - your smart custom 404 error page
10
  * Plugin URI: https://petersplugins.com/free-wordpress-plugins/404page/
11
  * Description: Custom 404 the easy way! Set any page as custom 404 error page. No coding needed. Works with (almost) every Theme.
12
- * Version: 8
13
  * Author: Peter Raschendorfer
14
  * Author URI: https://petersplugins.com
15
  * Text Domain: 404page
9
  * Plugin Name: 404page - your smart custom 404 error page
10
  * Plugin URI: https://petersplugins.com/free-wordpress-plugins/404page/
11
  * Description: Custom 404 the easy way! Set any page as custom 404 error page. No coding needed. Works with (almost) every Theme.
12
+ * Version: 9
13
  * Author: Peter Raschendorfer
14
  * Author URI: https://petersplugins.com
15
  * Text Domain: 404page
inc/class-404page-block-editor.php ADDED
@@ -0,0 +1,116 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ /**
4
+ * The 404page block editor plugin class
5
+ *
6
+ * @since 9
7
+ */
8
+
9
+ if ( ! defined( 'WPINC' ) ) {
10
+ die;
11
+ }
12
+
13
+ /**
14
+ * The block editor plugin class
15
+ */
16
+ if ( !class_exists( 'PP_404Page_BlockEditor' ) ) {
17
+
18
+ class PP_404Page_BlockEditor {
19
+
20
+ /**
21
+ * reference to core class
22
+ *
23
+ * @since 9
24
+ * @var object
25
+ * @access private
26
+ */
27
+ private $_core;
28
+
29
+
30
+ /**
31
+ * Initialize the class
32
+ *
33
+ * @since 9
34
+ * @access public
35
+ */
36
+ public function __construct( $_core ) {
37
+
38
+ $this->_core = $_core;
39
+
40
+ $this->init();
41
+
42
+ }
43
+
44
+
45
+ /**
46
+ * Do Init
47
+ *
48
+ * @since 9
49
+ * @access private
50
+ */
51
+ private function init() {
52
+
53
+ add_action( 'admin_head', array( $this, 'admin_style' ) );
54
+
55
+ }
56
+
57
+
58
+ /**
59
+ * Add Block Editor Style to Header if currently edited page is a custom 404 error page
60
+ *
61
+ * @since 9
62
+ * @access public
63
+ */
64
+ public function admin_style() {
65
+
66
+ if ( $this->is_gutenberg_editing() ) {
67
+
68
+ ?>
69
+ <style type="text/css">
70
+ .edit-post-layout__content:before { content: "<?php _e( 'You are currently editing your custom 404 error page', '404page'); ?>"; background-color: #333; color: #FFF; padding: 8px; font-size: 16px; display: block };
71
+ </style>
72
+ <?php
73
+
74
+ }
75
+
76
+ }
77
+
78
+
79
+ /**
80
+ * Is the 404 page edited in gutenberg editor?
81
+ *
82
+ * @since 9
83
+ * @access private
84
+ */
85
+ private function is_gutenberg_editing() {
86
+
87
+ // Is the current screen the page edit screen and is a custom 404 error page defined?
88
+ if ( get_current_screen()->id == 'page' && $this->_core->get_id() > 0 ) {
89
+
90
+ // Is the block editor active for pages and is the classic editor not loaded?
91
+ if ( function_exists( 'use_block_editor_for_post_type' ) && use_block_editor_for_post_type( 'page' ) && ! isset( $_GET['classic-editor'] ) ) {
92
+
93
+ global $post;
94
+
95
+ $all404pages = $this->_core->get_all_page_ids();
96
+
97
+ // Is the currently edited page a custom 404 error page?
98
+ if ( in_array( $post->ID, $all404pages ) ) {
99
+
100
+ return true;
101
+
102
+ }
103
+
104
+ }
105
+
106
+ }
107
+
108
+ return false;
109
+
110
+ }
111
+
112
+ }
113
+
114
+ }
115
+
116
+ ?>
inc/class-404page-classic-editor.php ADDED
@@ -0,0 +1,89 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ /**
4
+ * The 404page classic editor plugin class
5
+ *
6
+ * @since 9
7
+ */
8
+
9
+ if ( ! defined( 'WPINC' ) ) {
10
+ die;
11
+ }
12
+
13
+ /**
14
+ * The classic editor plugin class
15
+ */
16
+ if ( !class_exists( 'PP_404Page_ClassicEditor' ) ) {
17
+
18
+ class PP_404Page_ClassicEditor {
19
+
20
+ /**
21
+ * reference to core class
22
+ *
23
+ * @since 9
24
+ * @var object
25
+ * @access private
26
+ */
27
+ private $_core;
28
+
29
+
30
+ /**
31
+ * Initialize the class
32
+ *
33
+ * @since 9
34
+ * @access public
35
+ */
36
+ public function __construct( $_core ) {
37
+
38
+ $this->_core = $_core;
39
+
40
+ $this->init();
41
+
42
+ }
43
+
44
+
45
+ /**
46
+ * Do Init
47
+ *
48
+ * @since 9
49
+ * @access private
50
+ */
51
+ private function init() {
52
+
53
+ add_action( 'admin_head', array( $this, 'admin_style' ) );
54
+
55
+ }
56
+
57
+
58
+ /**
59
+ * Add Classic Editor Style to Header if currently edited page is a custom 404 error page
60
+ *
61
+ * @since 9
62
+ * @access public
63
+ */
64
+ public function admin_style() {
65
+
66
+ // we just ignore whether Gutenberg is used or not, because this classes do not exist if Gutenberg is active
67
+ if ( get_current_screen()->id == 'page' && $this->_core->get_id() > 0 ) {
68
+
69
+ global $post;
70
+
71
+ $all404pages = $this->_core->get_all_page_ids();
72
+ if ( in_array( $post->ID, $all404pages ) ) {
73
+
74
+ ?>
75
+ <style type="text/css">
76
+ #post-body-content:before { content: "<?php _e( 'You are currently editing your custom 404 error page', '404page'); ?>"; background-color: #333; color: #FFF; padding: 8px; font-size: 16px; display: block; margin-bottom: 10px };
77
+ </style>
78
+ <?php
79
+
80
+ }
81
+ }
82
+
83
+ }
84
+
85
+ }
86
+
87
+ }
88
+
89
+ ?>
inc/class-404page.php CHANGED
@@ -82,6 +82,28 @@ if ( !class_exists( 'PP_404Page' ) ) {
82
  private $admin_handle;
83
 
84
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
85
  /**
86
  * Init the Class
87
  *
@@ -211,6 +233,9 @@ if ( !class_exists( 'PP_404Page' ) ) {
211
  add_action( 'admin_notices', array( $this, 'admin_notices' ) );
212
  add_action( 'wp_ajax_pp_404page_dismiss_admin_notice', array( $this, 'dismiss_admin_notice' ) );
213
 
 
 
 
214
  }
215
 
216
 
@@ -223,7 +248,7 @@ if ( !class_exists( 'PP_404Page' ) ) {
223
  // as of v 2.2 always call set_mode
224
  // as of v 2.4 we do not need to add an init action hook
225
 
226
- if ( !is_admin() && $this->settings->get_id() > 0 ) {
227
 
228
  // as of v 3.0 we once check if there's a 404 page set and not in all functions separately
229
  $this->set_mode();
@@ -241,7 +266,7 @@ if ( !class_exists( 'PP_404Page' ) ) {
241
  if ( $this->settings->get_fire_error() ) {
242
 
243
  add_filter( 'wpseo_exclude_from_sitemap_by_post_ids', function () {
244
- return array( $this->settings->get_id() );
245
  } );
246
 
247
  }
@@ -256,7 +281,7 @@ if ( !class_exists( 'PP_404Page' ) ) {
256
  add_action( 'admin_enqueue_scripts', array( $this, 'admin_css' ) );
257
 
258
  // Remove 404 page from post list if activated
259
- if ( $this->settings->get_hide() and $this->settings->get_id() > 0 ) {
260
  add_action( 'pre_get_posts' ,array ( $this, 'exclude_404page' ) );
261
  }
262
 
@@ -504,7 +529,7 @@ if ( !class_exists( 'PP_404Page' ) ) {
504
  * Standard Mode
505
  */
506
  function do_404_header_standard_mode() {
507
- if ( is_page() && get_the_ID() == $this->settings->get_id() && !is_404() ) {
508
  status_header( 404 );
509
  nocache_headers();
510
  $this->maybe_force_404();
@@ -718,7 +743,7 @@ if ( !class_exists( 'PP_404Page' ) ) {
718
  */
719
  function admin_style() {
720
 
721
- if ( $this->settings->get_id() > 0 ) {
722
 
723
  echo '<style type="text/css">';
724
 
@@ -732,24 +757,6 @@ if ( !class_exists( 'PP_404Page' ) ) {
732
 
733
  }
734
 
735
- // the currently edited page is a 404 error page
736
- // @since 5
737
- if ( get_current_screen()->id == 'page' && $this->settings->get_id() > 0 ) {
738
-
739
- global $post;
740
-
741
- $all404pages = $this->get_all_page_ids();
742
- if ( in_array( $post->ID, $all404pages ) ) {
743
-
744
- ?>
745
- <style type="text/css">
746
- h1.wp-heading-inline:before { content: "404"; background-color: #333; color: #FFF; display: inline-block; padding: 0 5px; margin-right: 10px; }';
747
- </style>
748
- <?php
749
-
750
- }
751
- }
752
-
753
  }
754
 
755
 
@@ -758,16 +765,16 @@ if ( !class_exists( 'PP_404Page' ) ) {
758
  */
759
  function admin_404page() {
760
 
761
- if ( $this->settings->get_id() < 0 ) {
762
 
763
  echo '<div class="error form-invalid" style="line-height: 3em">' . __( 'The page you have selected as 404 page does not exist anymore. Please choose another page.', '404page' ) . '</div>';
764
  }
765
 
766
- wp_dropdown_pages( array( 'name' => '404page_page_id', 'id' => 'select404page', 'echo' => 1, 'show_option_none' => __( '&mdash; NONE (WP default 404 page) &mdash;', '404page'), 'option_none_value' => '0', 'selected' => $this->settings->get_id() ) );
767
 
768
- echo '<div id="404page_edit_link" style="display: none">' . get_edit_post_link( $this->settings->get_id() ) . '</div>';
769
  echo '<div id="404page_test_link" style="display: none">' . get_site_url() . '/404page-test-' . md5( rand() ) . '</div>';
770
- echo '<div id="404page_current_value" style="display: none">' . $this->settings->get_id() . '</div>';
771
  echo '<p class="submit"><input type="button" name="edit_404_page" id="edit_404_page" class="button secondary" value="' . __( 'Edit Page', '404page' ) . '" />&nbsp;<input type="button" name="test_404_page" id="test_404_page" class="button secondary" value="' . __( 'Test 404 error', '404page' ) . '" /></p>';
772
 
773
  }
@@ -1242,10 +1249,10 @@ if ( !class_exists( 'PP_404Page' ) ) {
1242
 
1243
  // @since 8
1244
  // show update notice
1245
- if ( current_user_can( 'manage_options' ) && get_user_meta( get_current_user_id(), 'pp-404page-update-notice-v8', true ) != 'dismissed' ) {
1246
  ?>
1247
- <div class="notice is-dismissible pp-404page-admin-notice" id="pp-404page-update-notice-v8">
1248
- <p><img src="<?php echo $this->get_asset_file( 'img', '/pluginicon.png' ); ?>" style="width: 48px; height: 48px; float: left; margin-right: 20px" /><strong><?php _e( '404page Version 8 Update Notice', '404page' ); ?></strong><br /><?php _e( 'Whats new? A compatibility issue with the current version of WPML has been fixed. This change may also fix or prevent compatibility issues with further plugins.', '404page' ); ?><div class="clear"></div></p>
1249
  </div>
1250
  <?php
1251
  }
@@ -1293,12 +1300,24 @@ if ( !class_exists( 'PP_404Page' ) ) {
1293
  }
1294
 
1295
 
 
 
 
 
 
 
 
 
 
 
 
 
1296
  /**
1297
  * get the id of the 404 page in the current language if WPML or Polylang is active
1298
  */
1299
  private function get_page_id() {
1300
 
1301
- $pageid = $this->settings->get_id();
1302
 
1303
  if ( $pageid > 0 ) {
1304
 
@@ -1328,14 +1347,15 @@ if ( !class_exists( 'PP_404Page' ) ) {
1328
  * if WPML is active this function returns an array of all page ids in all available languages
1329
  * otherwise it returns the page id as array
1330
  * introduced in v 2.4
 
1331
  */
1332
- private function get_all_page_ids() {
1333
 
1334
  if ( defined( 'ICL_SITEPRESS_VERSION' ) ) {
1335
 
1336
  // WPML is active
1337
  // get an array for all translations
1338
- $pageid = $this->settings->get_id();
1339
  $pages = array( $pageid );
1340
 
1341
  if ( $pageid > 0 ) {
@@ -1453,7 +1473,7 @@ if ( !class_exists( 'PP_404Page' ) ) {
1453
  // check if there's a custom 404 page set
1454
  function pp_404_is_active() {
1455
 
1456
- return ( $this->settings->get_id() > 0 );
1457
 
1458
  }
1459
 
@@ -1469,7 +1489,7 @@ if ( !class_exists( 'PP_404Page' ) ) {
1469
 
1470
  $title = '';
1471
 
1472
- if ( $this->settings->get_id() > 0 && $this->settings->get_native() ) {
1473
 
1474
  $title = get_the_title( $this->get_page_id() );
1475
 
@@ -1491,7 +1511,7 @@ if ( !class_exists( 'PP_404Page' ) ) {
1491
 
1492
  $content = '';
1493
 
1494
- if ( $this->settings->get_id() > 0 && $this->settings->get_native() ) {
1495
 
1496
  $content = apply_filters( 'the_content', get_post_field( 'post_content', $this->get_page_id() ) );
1497
 
@@ -1513,9 +1533,9 @@ if ( !class_exists( 'PP_404Page' ) ) {
1513
  * get path for asset file
1514
  *
1515
  * @since 7
1516
- * @access private
1517
  */
1518
- private function get_asset_file( $dir, $file ) {
1519
 
1520
  return plugins_url( 'assets/' . $dir . '/' . $file, $this->get_plugin_file() );
1521
 
82
  private $admin_handle;
83
 
84
 
85
+ /**
86
+ * Block Editor Class
87
+ *
88
+ * @see class-404page-block-editor.php
89
+ * @since 9
90
+ * @var object
91
+ * @access private
92
+ */
93
+ private $blockeditor;
94
+
95
+
96
+ /**
97
+ * Classic Editor Class
98
+ *
99
+ * @see class-404page-classic-editor.php
100
+ * @since 9
101
+ * @var object
102
+ * @access private
103
+ */
104
+ private $classiceditor;
105
+
106
+
107
  /**
108
  * Init the Class
109
  *
233
  add_action( 'admin_notices', array( $this, 'admin_notices' ) );
234
  add_action( 'wp_ajax_pp_404page_dismiss_admin_notice', array( $this, 'dismiss_admin_notice' ) );
235
 
236
+ $this->blockeditor = new PP_404Page_BlockEditor( $this );
237
+ $this->classiceditor = new PP_404Page_ClassicEditor( $this );
238
+
239
  }
240
 
241
 
248
  // as of v 2.2 always call set_mode
249
  // as of v 2.4 we do not need to add an init action hook
250
 
251
+ if ( !is_admin() && $this->get_id() > 0 ) {
252
 
253
  // as of v 3.0 we once check if there's a 404 page set and not in all functions separately
254
  $this->set_mode();
266
  if ( $this->settings->get_fire_error() ) {
267
 
268
  add_filter( 'wpseo_exclude_from_sitemap_by_post_ids', function () {
269
+ return array( $this->get_id() );
270
  } );
271
 
272
  }
281
  add_action( 'admin_enqueue_scripts', array( $this, 'admin_css' ) );
282
 
283
  // Remove 404 page from post list if activated
284
+ if ( $this->settings->get_hide() and $this->get_id() > 0 ) {
285
  add_action( 'pre_get_posts' ,array ( $this, 'exclude_404page' ) );
286
  }
287
 
529
  * Standard Mode
530
  */
531
  function do_404_header_standard_mode() {
532
+ if ( is_page() && get_the_ID() == $this->get_id() && !is_404() ) {
533
  status_header( 404 );
534
  nocache_headers();
535
  $this->maybe_force_404();
743
  */
744
  function admin_style() {
745
 
746
+ if ( $this->get_id() > 0 ) {
747
 
748
  echo '<style type="text/css">';
749
 
757
 
758
  }
759
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
760
  }
761
 
762
 
765
  */
766
  function admin_404page() {
767
 
768
+ if ( $this->get_id() < 0 ) {
769
 
770
  echo '<div class="error form-invalid" style="line-height: 3em">' . __( 'The page you have selected as 404 page does not exist anymore. Please choose another page.', '404page' ) . '</div>';
771
  }
772
 
773
+ wp_dropdown_pages( array( 'name' => '404page_page_id', 'id' => 'select404page', 'echo' => 1, 'show_option_none' => __( '&mdash; NONE (WP default 404 page) &mdash;', '404page'), 'option_none_value' => '0', 'selected' => $this->get_id() ) );
774
 
775
+ echo '<div id="404page_edit_link" style="display: none">' . get_edit_post_link( $this->get_id() ) . '</div>';
776
  echo '<div id="404page_test_link" style="display: none">' . get_site_url() . '/404page-test-' . md5( rand() ) . '</div>';
777
+ echo '<div id="404page_current_value" style="display: none">' . $this->get_id() . '</div>';
778
  echo '<p class="submit"><input type="button" name="edit_404_page" id="edit_404_page" class="button secondary" value="' . __( 'Edit Page', '404page' ) . '" />&nbsp;<input type="button" name="test_404_page" id="test_404_page" class="button secondary" value="' . __( 'Test 404 error', '404page' ) . '" /></p>';
779
 
780
  }
1249
 
1250
  // @since 8
1251
  // show update notice
1252
+ if ( current_user_can( 'manage_options' ) && get_user_meta( get_current_user_id(), 'pp-404page-update-notice-v9', true ) != 'dismissed' ) {
1253
  ?>
1254
+ <div class="notice is-dismissible pp-404page-admin-notice" id="pp-404page-update-notice-v9">
1255
+ <p><img src="<?php echo $this->get_asset_file( 'img', '/pluginicon.png' ); ?>" style="width: 48px; height: 48px; float: left; margin-right: 20px" /><strong><?php _e( 'What\'s new in Version 9?', '404page' ); ?></strong><br /><?php _e( 'Display a note in Block Editor Gutenberg if the currently edited page is the custom 404 error page.', '404page' ); ?><br />[<a href="https://wordpress.org/plugins/404page/#developers"><?php _e( 'Changelog', '404page' ); ?></a>]<div class="clear"></div></p>
1256
  </div>
1257
  <?php
1258
  }
1300
  }
1301
 
1302
 
1303
+ /**
1304
+ * get id of the 404 page
1305
+ *
1306
+ * @since 9
1307
+ * @access public
1308
+ */
1309
+ public function get_id() {
1310
+
1311
+ return $this->settings->get_id();
1312
+
1313
+ }
1314
+
1315
  /**
1316
  * get the id of the 404 page in the current language if WPML or Polylang is active
1317
  */
1318
  private function get_page_id() {
1319
 
1320
+ $pageid = $this->get_id();
1321
 
1322
  if ( $pageid > 0 ) {
1323
 
1347
  * if WPML is active this function returns an array of all page ids in all available languages
1348
  * otherwise it returns the page id as array
1349
  * introduced in v 2.4
1350
+ * public since v9 to access it from other classes
1351
  */
1352
+ public function get_all_page_ids() {
1353
 
1354
  if ( defined( 'ICL_SITEPRESS_VERSION' ) ) {
1355
 
1356
  // WPML is active
1357
  // get an array for all translations
1358
+ $pageid = $this->get_id();
1359
  $pages = array( $pageid );
1360
 
1361
  if ( $pageid > 0 ) {
1473
  // check if there's a custom 404 page set
1474
  function pp_404_is_active() {
1475
 
1476
+ return ( $this->get_id() > 0 );
1477
 
1478
  }
1479
 
1489
 
1490
  $title = '';
1491
 
1492
+ if ( $this->get_id() > 0 && $this->settings->get_native() ) {
1493
 
1494
  $title = get_the_title( $this->get_page_id() );
1495
 
1511
 
1512
  $content = '';
1513
 
1514
+ if ( $this->get_id() > 0 && $this->settings->get_native() ) {
1515
 
1516
  $content = apply_filters( 'the_content', get_post_field( 'post_content', $this->get_page_id() ) );
1517
 
1533
  * get path for asset file
1534
  *
1535
  * @since 7
1536
+ * @access public
1537
  */
1538
+ public function get_asset_file( $dir, $file ) {
1539
 
1540
  return plugins_url( 'assets/' . $dir . '/' . $file, $this->get_plugin_file() );
1541
 
loader.php CHANGED
@@ -18,6 +18,8 @@ if ( ! defined( 'WPINC' ) ) {
18
  */
19
  require_once( plugin_dir_path( __FILE__ ) . '/inc/class-404page.php' );
20
  require_once( plugin_dir_path( __FILE__ ) . '/inc/class-404page-settings.php' );
 
 
21
 
22
 
23
  /**
@@ -29,7 +31,7 @@ function pp_404page() {
29
  'file' => dirname( __FILE__ ) . '/404page.php',
30
  'slug' => pathinfo( dirname( __FILE__ ) . '/404page.php', PATHINFO_FILENAME ),
31
  'name' => '404page - your smart custom 404 error page',
32
- 'version' => '8 BETA'
33
  ) );
34
 
35
  }
18
  */
19
  require_once( plugin_dir_path( __FILE__ ) . '/inc/class-404page.php' );
20
  require_once( plugin_dir_path( __FILE__ ) . '/inc/class-404page-settings.php' );
21
+ require_once( plugin_dir_path( __FILE__ ) . '/inc/class-404page-block-editor.php' );
22
+ require_once( plugin_dir_path( __FILE__ ) . '/inc/class-404page-classic-editor.php' );
23
 
24
 
25
  /**
31
  'file' => dirname( __FILE__ ) . '/404page.php',
32
  'slug' => pathinfo( dirname( __FILE__ ) . '/404page.php', PATHINFO_FILENAME ),
33
  'name' => '404page - your smart custom 404 error page',
34
+ 'version' => '9'
35
  ) );
36
 
37
  }
readme.txt CHANGED
@@ -4,7 +4,7 @@ Donate link: https://petersplugins.com/make-a-donation/
4
  Tags: page, 404, error, error page, 404 page, page not found, page not found error, 404 error page, missing, broken link, template, 404 link, seo, custom 404, custom 404 page, custom 404 error, custom 404 error page, customize 404, customize 404 page, customize 404 error page
5
  Requires at least: 4.0
6
  Tested up to: 5.0
7
- Stable tag: 8
8
  Requires PHP: 5.4
9
  License: GPLv2 or later
10
  License URI: http://www.gnu.org/licenses/gpl-2.0.html
@@ -129,9 +129,10 @@ If you are a theme developer you can add native support for the 404page plugin t
129
  == Screenshots ==
130
 
131
  1. The default 404 error page of the currently used themme (WP Bootstrap Starter used for this example)
132
- 2. Create custom 404 error page like any other page using the WordPress editor
133
- 3. Select the created page as 404 error page
134
- 4. The custom 404 error page in action
 
135
 
136
  == Frequently Asked Questions ==
137
 
@@ -152,6 +153,9 @@ Please use the [Support Forum](https://wordpress.org/support/plugin/404page).
152
 
153
  == Changelog ==
154
 
 
 
 
155
  = 8 (2019-01-11) =
156
  * fixed compatibility issue with latest WPML version
157
  * code improvement
@@ -261,6 +265,9 @@ Please use the [Support Forum](https://wordpress.org/support/plugin/404page).
261
 
262
  == Upgrade Notice ==
263
 
 
 
 
264
  = 8 =
265
  fixed compatibility issue with latest WPML version
266
 
4
  Tags: page, 404, error, error page, 404 page, page not found, page not found error, 404 error page, missing, broken link, template, 404 link, seo, custom 404, custom 404 page, custom 404 error, custom 404 error page, customize 404, customize 404 page, customize 404 error page
5
  Requires at least: 4.0
6
  Tested up to: 5.0
7
+ Stable tag: 9
8
  Requires PHP: 5.4
9
  License: GPLv2 or later
10
  License URI: http://www.gnu.org/licenses/gpl-2.0.html
129
  == Screenshots ==
130
 
131
  1. The default 404 error page of the currently used themme (WP Bootstrap Starter used for this example)
132
+ 2. Editing the custom 404 error page using the Classic Editor
133
+ 3. Editing the custom 404 error page using the Block Editor (Gutenberg)
134
+ 4. Select the created page as 404 error page
135
+ 5. The custom 404 error page in action
136
 
137
  == Frequently Asked Questions ==
138
 
153
 
154
  == Changelog ==
155
 
156
+ = 8 (2019-01-24) =
157
+ * Gutenberg note added
158
+
159
  = 8 (2019-01-11) =
160
  * fixed compatibility issue with latest WPML version
161
  * code improvement
265
 
266
  == Upgrade Notice ==
267
 
268
+ = 8 =
269
+ Gutenberg note added
270
+
271
  = 8 =
272
  fixed compatibility issue with latest WPML version
273