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

Version Description

Plugin Foundation updated to version PPF02 two new functions for developers

Download this release

Release Info

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

Code changes from version 11.0.5 to 11.1.0

404page.php CHANGED
@@ -9,7 +9,7 @@
9
  * Plugin Name: 404page - your smart custom 404 error page
10
  * Plugin URI: https://petersplugins.com/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: 11.0.5
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/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: 11.1.0
13
  * Author: Peter Raschendorfer
14
  * Author URI: https://petersplugins.com
15
  * Text Domain: 404page
functions.php CHANGED
@@ -52,6 +52,7 @@ function pp_404_get_the_content() {
52
 
53
  }
54
 
 
55
  // this function can be used by a theme to print out the content of the custom 404 page in native support
56
  function pp_404_the_content() {
57
 
@@ -59,4 +60,19 @@ function pp_404_the_content() {
59
 
60
  }
61
 
62
- ?>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
52
 
53
  }
54
 
55
+
56
  // this function can be used by a theme to print out the content of the custom 404 page in native support
57
  function pp_404_the_content() {
58
 
60
 
61
  }
62
 
63
+
64
+ // this function returns the page id of the selected 404 page - in a multilingual environment this returs the id of the page in the current language
65
+ function pp_404_get_page_id() {
66
+
67
+ return pp_404page()->get_page_id();
68
+
69
+ }
70
+
71
+
72
+ // this function returns an array of page ids in all languages
73
+ function pp_404_get_all_page_ids() {
74
+
75
+ return pp_404page()->get_all_page_ids();
76
+
77
+ }
78
+ ?>
inc/class-404page-admin.php CHANGED
@@ -15,7 +15,7 @@ if ( ! defined( 'WPINC' ) ) {
15
  */
16
  if ( !class_exists( 'PP_404Page_Admin' ) ) {
17
 
18
- class PP_404Page_Admin extends PPF01_Admin {
19
 
20
 
21
  /**
15
  */
16
  if ( !class_exists( 'PP_404Page_Admin' ) ) {
17
 
18
+ class PP_404Page_Admin extends PPF02_Admin {
19
 
20
 
21
  /**
inc/class-404page-block-editor.php CHANGED
@@ -15,7 +15,7 @@ if ( ! defined( 'WPINC' ) ) {
15
  */
16
  if ( !class_exists( 'PP_404Page_BlockEditor' ) ) {
17
 
18
- class PP_404Page_BlockEditor extends PPF01_SubClass {
19
 
20
  /**
21
  * Do Init
15
  */
16
  if ( !class_exists( 'PP_404Page_BlockEditor' ) ) {
17
 
18
+ class PP_404Page_BlockEditor extends PPF02_SubClass {
19
 
20
  /**
21
  * Do Init
inc/class-404page-classic-editor.php CHANGED
@@ -15,7 +15,7 @@ if ( ! defined( 'WPINC' ) ) {
15
  */
16
  if ( !class_exists( 'PP_404Page_ClassicEditor' ) ) {
17
 
18
- class PP_404Page_ClassicEditor extends PPF01_SubClass {
19
 
20
  /**
21
  * Do Init
15
  */
16
  if ( !class_exists( 'PP_404Page_ClassicEditor' ) ) {
17
 
18
+ class PP_404Page_ClassicEditor extends PPF02_SubClass {
19
 
20
  /**
21
  * Do Init
inc/class-404page-deprecated.php CHANGED
@@ -17,7 +17,7 @@ if ( ! defined( 'WPINC' ) ) {
17
  */
18
  if ( !class_exists( 'PP_404Page_Deprecated' ) ) {
19
 
20
- class PP_404Page_Deprecated extends PPF01_SubClass {
21
 
22
  /**
23
  * Do Init
17
  */
18
  if ( !class_exists( 'PP_404Page_Deprecated' ) ) {
19
 
20
+ class PP_404Page_Deprecated extends PPF02_SubClass {
21
 
22
  /**
23
  * Do Init
inc/class-404page-settings.php CHANGED
@@ -17,7 +17,7 @@ if ( ! defined( 'WPINC' ) ) {
17
  */
18
  if ( !class_exists( 'PP_404Page_Settings' ) ) {
19
 
20
- class PP_404Page_Settings extends PPF01_Settings {
21
 
22
  /**
23
  * sanitize settings
17
  */
18
  if ( !class_exists( 'PP_404Page_Settings' ) ) {
19
 
20
+ class PP_404Page_Settings extends PPF02_Settings {
21
 
22
  /**
23
  * sanitize settings
inc/class-404page.php CHANGED
@@ -23,7 +23,7 @@ if ( ! defined( 'PP_404' ) ) {
23
  if ( !class_exists( 'PP_404Page' ) ) {
24
 
25
 
26
- class PP_404Page extends PPF01_Plugin {
27
 
28
 
29
  /**
@@ -865,8 +865,9 @@ if ( !class_exists( 'PP_404Page' ) ) {
865
 
866
  /**
867
  * get the id of the 404 page in the current language if WPML or Polylang is active
 
868
  */
869
- private function get_page_id() {
870
 
871
  $pageid = $this->settings()->get( 'page_id' );
872
 
23
  if ( !class_exists( 'PP_404Page' ) ) {
24
 
25
 
26
+ class PP_404Page extends PPF02_Plugin {
27
 
28
 
29
  /**
865
 
866
  /**
867
  * get the id of the 404 page in the current language if WPML or Polylang is active
868
+ * public since v 11.1.0 to use it in pp_404_get_page_id()
869
  */
870
+ public function get_page_id() {
871
 
872
  $pageid = $this->settings()->get( 'page_id' );
873
 
inc/ppf/assets/js/pp-admin-page.js CHANGED
@@ -1,5 +1,6 @@
1
  jQuery( document ).ready(function( $ ) {
2
 
 
3
 
4
  $( '.tab-navigation .tabset' ).click( function() {
5
 
@@ -11,17 +12,17 @@ jQuery( document ).ready(function( $ ) {
11
  $( '.tab-navigation .tabset.current' ).removeClass( 'current ');
12
  $( this ).addClass( 'current' );
13
 
14
- $.cookie( '404page_current_tab', $( '.tab-navigation .tabset.current' ).attr('id') );
15
 
16
  }
17
 
18
  });
19
 
20
 
21
- var current_tab = jQuery.cookie( '404page_current_tab' );
22
  if ( current_tab === undefined ) {
23
  current_tab = $( '.tab-navigation .tabset:first' ).attr('id');
24
- $.removeCookie( '404page_current_tab' );
25
  }
26
  $( '#' + current_tab ).trigger( 'click' );
27
 
1
  jQuery( document ).ready(function( $ ) {
2
 
3
+ var cookie_name = pp_admin_cookie_prefix + '_current_tab';
4
 
5
  $( '.tab-navigation .tabset' ).click( function() {
6
 
12
  $( '.tab-navigation .tabset.current' ).removeClass( 'current ');
13
  $( this ).addClass( 'current' );
14
 
15
+ $.cookie( cookie_name, $( '.tab-navigation .tabset.current' ).attr('id') );
16
 
17
  }
18
 
19
  });
20
 
21
 
22
+ var current_tab = jQuery.cookie( cookie_name );
23
  if ( current_tab === undefined ) {
24
  current_tab = $( '.tab-navigation .tabset:first' ).attr('id');
25
+ $.removeCookie( cookie_name );
26
  }
27
  $( '#' + current_tab ).trigger( 'click' );
28
 
inc/ppf/loader.php CHANGED
@@ -3,9 +3,9 @@
3
  /**
4
  * Plugin Foundation Loader
5
  *
6
- * Peter's Plugins Foundation 01
7
  *
8
- * @package PPF01
9
  * @author Peter Raschendorfer
10
  * @license GPL2+
11
  */
3
  /**
4
  * Plugin Foundation Loader
5
  *
6
+ * Peter's Plugins Foundation 02
7
  *
8
+ * @package PPF02
9
  * @author Peter Raschendorfer
10
  * @license GPL2+
11
  */
inc/ppf/ppf-admin.php CHANGED
@@ -3,17 +3,17 @@
3
  /**
4
  * Admin Class
5
  *
6
- * Peter's Plugins Foundation 01
7
  *
8
- * @package PPF01
9
  * @author Peter Raschendorfer
10
  * @license GPL2+
11
  */
12
 
13
- if ( !class_exists( 'PPF01_Admin' ) ) {
14
 
15
 
16
- abstract class PPF01_Admin extends PPF01_SubClass {
17
 
18
 
19
  /**
@@ -188,6 +188,8 @@ if ( !class_exists( 'PPF01_Admin' ) ) {
188
  */
189
  public function print_setting_sections() {
190
 
 
 
191
  foreach( $this->_sections as $section ) {
192
 
193
  $section_id = $this->core()->get_plugin_slug() . '-' . $section['section'];
@@ -198,7 +200,7 @@ if ( !class_exists( 'PPF01_Admin' ) ) {
198
  $extraclass = ' nosubmit';
199
  }
200
 
201
- echo '<div class="panel' . $extraclass . '" id="content-' . $section_id . '">';
202
 
203
  if ( array_key_exists( 'html', $section ) ) {
204
 
@@ -218,6 +220,8 @@ if ( !class_exists( 'PPF01_Admin' ) ) {
218
 
219
  echo '</div>';
220
 
 
 
221
  }
222
 
223
  }
@@ -232,17 +236,17 @@ if ( !class_exists( 'PPF01_Admin' ) ) {
232
  */
233
  public function print_setting_sections_nav() {
234
 
 
 
235
  echo '<ul class="tab-navigation">';
236
 
237
  foreach( $this->_sections as $section ) {
238
 
239
  $section_id = $this->core()->get_plugin_slug() . '-' . $section['section'];
240
 
241
- //echo '<li><a href="#' . $section_id . '"' . $first . '>' . $section['title'] . '</a></li>';
242
-
243
- // echo '<li><input type="radio" name="tabset" id="tab-' . $section_id . '" data-tab-content="content-' . $section_id . '"aria-controls="' . $section['title'] . '"' . $sel . '><label for="tab-' . $section_id . '">' . $section['title'] . '</label>';
244
 
245
- echo '<li><div class="tabset" id="tab-' . $section_id . '" data-tab-content="content-' . $section_id . '">' . $section['title'] . '</div>';
246
 
247
  }
248
 
@@ -367,7 +371,12 @@ if ( !class_exists( 'PPF01_Admin' ) ) {
367
 
368
  }
369
 
370
- settings_errors();
 
 
 
 
 
371
 
372
  echo '<div class="wrap pp-admin-page-wrapper" id="pp-' . $this->core()->get_plugin_slug() . '-settings"><div class="pp-admin-notice-area"><div class="wp-header-end"></div></div>';
373
  echo '<div class="pp-admin-page-header">';
@@ -381,11 +390,12 @@ if ( !class_exists( 'PPF01_Admin' ) ) {
381
  $this->print_setting_sections();
382
  submit_button();
383
  echo '</div></form></div></div>';
 
384
 
385
- wp_enqueue_style( 'ppf01', $this->get_foundation_asset_url( 'css', 'pp-admin-page.css' ) );
386
 
387
- wp_enqueue_script( 'ppf01-cookie', $this->get_foundation_asset_url( 'js', 'jquery.cookie.js' ), array( 'jquery' ), false, true );
388
- wp_enqueue_script( 'ppf01', $this->get_foundation_asset_url( 'js', 'pp-admin-page.js' ), array( 'jquery', 'ppf01-cookie' ), false, true );
389
 
390
  }
391
 
3
  /**
4
  * Admin Class
5
  *
6
+ * Peter's Plugins Foundation 02
7
  *
8
+ * @package PPF02
9
  * @author Peter Raschendorfer
10
  * @license GPL2+
11
  */
12
 
13
+ if ( !class_exists( 'PPF02_Admin' ) ) {
14
 
15
 
16
+ abstract class PPF02_Admin extends PPF02_SubClass {
17
 
18
 
19
  /**
188
  */
189
  public function print_setting_sections() {
190
 
191
+ $currentclass = ' current';
192
+
193
  foreach( $this->_sections as $section ) {
194
 
195
  $section_id = $this->core()->get_plugin_slug() . '-' . $section['section'];
200
  $extraclass = ' nosubmit';
201
  }
202
 
203
+ echo '<div class="panel' . $extraclass . $currentclass . '" id="content-' . $section_id . '">';
204
 
205
  if ( array_key_exists( 'html', $section ) ) {
206
 
220
 
221
  echo '</div>';
222
 
223
+ $currentclass = '';
224
+
225
  }
226
 
227
  }
236
  */
237
  public function print_setting_sections_nav() {
238
 
239
+ $currentclass = ' current';
240
+
241
  echo '<ul class="tab-navigation">';
242
 
243
  foreach( $this->_sections as $section ) {
244
 
245
  $section_id = $this->core()->get_plugin_slug() . '-' . $section['section'];
246
 
247
+ echo '<li><div class="tabset' . $currentclass . '" id="tab-' . $section_id . '" data-tab-content="content-' . $section_id . '">' . $section['title'] . '</div>';
 
 
248
 
249
+ $currentclass = '';
250
 
251
  }
252
 
371
 
372
  }
373
 
374
+ if ( get_current_screen()->parent_base != 'options-general' ) {
375
+
376
+ // On Option Screens settings_errors() is called automatically
377
+ settings_errors();
378
+
379
+ }
380
 
381
  echo '<div class="wrap pp-admin-page-wrapper" id="pp-' . $this->core()->get_plugin_slug() . '-settings"><div class="pp-admin-notice-area"><div class="wp-header-end"></div></div>';
382
  echo '<div class="pp-admin-page-header">';
390
  $this->print_setting_sections();
391
  submit_button();
392
  echo '</div></form></div></div>';
393
+ echo '<script>var pp_admin_cookie_prefix="' . $this->core()->get_plugin_slug() . '";</script>';
394
 
395
+ wp_enqueue_style( $this->core()->get_plugin_slug() . '-ppf02', $this->get_foundation_asset_url( 'css', 'pp-admin-page.css' ) );
396
 
397
+ wp_enqueue_script( $this->core()->get_plugin_slug() . '-ppf02-cookie', $this->get_foundation_asset_url( 'js', 'jquery.cookie.js' ), array( 'jquery' ), false, true );
398
+ wp_enqueue_script( $this->core()->get_plugin_slug() . '-ppf02', $this->get_foundation_asset_url( 'js', 'pp-admin-page.js' ), array( 'jquery', $this->core()->get_plugin_slug() . '-ppf02-cookie' ), false, true );
399
 
400
  }
401
 
inc/ppf/ppf-class.php CHANGED
@@ -3,9 +3,9 @@
3
  /**
4
  * Base Class
5
  *
6
- * Peter's Plugins Foundation 01
7
  *
8
- * @package PPF01
9
  * @author Peter Raschendorfer
10
  * @license GPL2+
11
  */
@@ -19,20 +19,22 @@
19
  }
20
 
21
 
22
- if ( !class_exists( 'PPF01_Class' ) ) {
23
 
24
 
25
- abstract class PPF01_Class {
26
 
27
 
28
  /**
29
  * foundation dir
30
  *
 
 
31
  * @since PPF01
32
  * @var string
33
  * @access private
34
  */
35
- private $_dir;
36
 
37
 
38
  /**
@@ -43,15 +45,14 @@ if ( !class_exists( 'PPF01_Class' ) ) {
43
  */
44
  public function __construct() {
45
 
46
- $ca = class_parents( $this );
47
- $rc = new ReflectionClass( end( $ca ) );
48
- $this->_dir = dirname($rc->getFileName());
49
 
50
  }
51
 
52
 
53
  /**
54
- * get doundation directory
55
  *
56
  * @since PPF01
57
  * @access protected
@@ -59,8 +60,11 @@ if ( !class_exists( 'PPF01_Class' ) ) {
59
  */
60
  protected function get_foundation_dir() {
61
 
62
- return $this->_dir;
63
 
 
 
 
64
  }
65
 
66
 
3
  /**
4
  * Base Class
5
  *
6
+ * Peter's Plugins Foundation 02
7
  *
8
+ * @package PPF02
9
  * @author Peter Raschendorfer
10
  * @license GPL2+
11
  */
19
  }
20
 
21
 
22
+ if ( !class_exists( 'PPF02_Class' ) ) {
23
 
24
 
25
+ abstract class PPF02_Class {
26
 
27
 
28
  /**
29
  * foundation dir
30
  *
31
+ * removed in PPF02
32
+ *
33
  * @since PPF01
34
  * @var string
35
  * @access private
36
  */
37
+ // private $_dir;
38
 
39
 
40
  /**
45
  */
46
  public function __construct() {
47
 
48
+ // removed in PPF02
49
+ // $this->_dir = __DIR__;
 
50
 
51
  }
52
 
53
 
54
  /**
55
+ * get foundation directory
56
  *
57
  * @since PPF01
58
  * @access protected
60
  */
61
  protected function get_foundation_dir() {
62
 
63
+ // since PPF02 we have to get the Directory of the Called Class to allow multiple classes based on the same Plugin Foundation
64
 
65
+ $rc = new ReflectionClass( get_called_class() );
66
+ return dirname( $rc->getFileName() ) . '/ppf';
67
+
68
  }
69
 
70
 
inc/ppf/ppf-plugin.php CHANGED
@@ -3,27 +3,28 @@
3
  /**
4
  * Plugin Base Class
5
  *
6
- * Peter's Plugins Foundation 01
7
  *
8
- * @package PPF01
9
  * @author Peter Raschendorfer
10
  * @license GPL2+
11
  */
12
 
13
 
14
- if ( !class_exists( 'PPF01_Plugin' ) ) {
15
 
16
-
17
- abstract class PPF01_Plugin extends PPF01_Class {
18
 
19
  /**
20
- * Instance
21
  *
22
- * @since PPF01
 
 
23
  * @var singleton
24
  * @access protected
25
  */
26
- protected static $_instance = null;
27
 
28
 
29
  /**
@@ -158,7 +159,7 @@ if ( !class_exists( 'PPF01_Plugin' ) ) {
158
  *
159
  * @since PPF01
160
  */
161
- protected function __clone() {}
162
 
163
 
164
  /**
@@ -173,16 +174,17 @@ if ( !class_exists( 'PPF01_Plugin' ) ) {
173
  * }
174
  * @return singleton
175
  */
176
- public static function getInstance( $settings ) {
177
-
178
- if ( null === static::$_instance ) {
179
 
180
- static::$_instance = new static( $settings );
181
-
182
- }
183
-
184
- return static::$_instance;
185
-
 
 
186
  }
187
 
188
 
3
  /**
4
  * Plugin Base Class
5
  *
6
+ * Peter's Plugins Foundation 02
7
  *
8
+ * @package PPF02
9
  * @author Peter Raschendorfer
10
  * @license GPL2+
11
  */
12
 
13
 
14
+ if ( !class_exists( 'PPF02_Plugin' ) ) {
15
 
16
+ abstract class PPF02_Plugin extends PPF02_Class {
 
17
 
18
  /**
19
+ * Instances
20
  *
21
+ * since PPF02 this is an array to allow multiple classes based on the same Plugin Foundation
22
+ *
23
+ * @since PPF02
24
  * @var singleton
25
  * @access protected
26
  */
27
+ protected static $_instances = array();
28
 
29
 
30
  /**
159
  *
160
  * @since PPF01
161
  */
162
+ final protected function __clone() {}
163
 
164
 
165
  /**
174
  * }
175
  * @return singleton
176
  */
177
+ final public static function getInstance( $settings )
178
+ {
 
179
 
180
+ $calledClass = get_called_class();
181
+
182
+ if ( !isset( $_instances[$calledClass] ) )
183
+ {
184
+ $_instances[$calledClass] = new $calledClass( $settings );
185
+ }
186
+
187
+ return $_instances[$calledClass];
188
  }
189
 
190
 
inc/ppf/ppf-settings.php CHANGED
@@ -3,17 +3,17 @@
3
  /**
4
  * Settings Class
5
  *
6
- * Peter's Plugins Foundation 01
7
  *
8
- * @package PPF01
9
  * @author Peter Raschendorfer
10
  * @license GPL2+
11
  */
12
 
13
- if ( !class_exists( 'PPF01_Settings' ) ) {
14
 
15
 
16
- abstract class PPF01_Settings extends PPF01_SubClass {
17
 
18
  /**
19
  * name of settings in databse (meta_key)
3
  /**
4
  * Settings Class
5
  *
6
+ * Peter's Plugins Foundation 02
7
  *
8
+ * @package PPF02
9
  * @author Peter Raschendorfer
10
  * @license GPL2+
11
  */
12
 
13
+ if ( !class_exists( 'PPF02_Settings' ) ) {
14
 
15
 
16
+ abstract class PPF02_Settings extends PPF02_SubClass {
17
 
18
  /**
19
  * name of settings in databse (meta_key)
inc/ppf/ppf-subclass.php CHANGED
@@ -3,17 +3,17 @@
3
  /**
4
  * Plugin Base Sub-Class
5
  *
6
- * Peter's Plugins Foundation 01
7
  *
8
- * @package PPF01
9
  * @author Peter Raschendorfer
10
  * @license GPL2+
11
  */
12
 
13
- if ( !class_exists( 'PPF01_SubClass' ) ) {
14
 
15
 
16
- abstract class PPF01_SubClass extends PPF01_Class {
17
 
18
  /**
19
  * reference to core class
3
  /**
4
  * Plugin Base Sub-Class
5
  *
6
+ * Peter's Plugins Foundation 02
7
  *
8
+ * @package PPF02
9
  * @author Peter Raschendorfer
10
  * @license GPL2+
11
  */
12
 
13
+ if ( !class_exists( 'PPF02_SubClass' ) ) {
14
 
15
 
16
+ abstract class PPF02_SubClass extends PPF02_Class {
17
 
18
  /**
19
  * reference to core class
loader.php CHANGED
@@ -26,6 +26,12 @@ require_once( plugin_dir_path( __FILE__ ) . '/inc/ppf/loader.php' );
26
  require_once( plugin_dir_path( __FILE__ ) . '/inc/class-404page.php' );
27
 
28
 
 
 
 
 
 
 
29
  /**
30
  * Main Function
31
  */
@@ -36,7 +42,7 @@ function pp_404page() {
36
  'slug' => pathinfo( dirname( __FILE__ ) . '/404page.php', PATHINFO_FILENAME ),
37
  'name' => '404page - your smart custom 404 error page',
38
  'shortname' => '404page',
39
- 'version' => '11.0.5'
40
  ) );
41
 
42
  }
26
  require_once( plugin_dir_path( __FILE__ ) . '/inc/class-404page.php' );
27
 
28
 
29
+ /**
30
+ * Load Plugin Functions
31
+ */
32
+ require_once( plugin_dir_path( __FILE__ ) . '/functions.php' );
33
+
34
+
35
  /**
36
  * Main Function
37
  */
42
  'slug' => pathinfo( dirname( __FILE__ ) . '/404page.php', PATHINFO_FILENAME ),
43
  'name' => '404page - your smart custom 404 error page',
44
  'shortname' => '404page',
45
+ 'version' => '11.1.0'
46
  ) );
47
 
48
  }
readme.txt CHANGED
@@ -2,8 +2,8 @@
2
  Contributors: petersplugins
3
  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, classicpress
4
  Requires at least: 4.0
5
- Tested up to: 5.2
6
- Stable tag: 11.0.5
7
  Requires PHP: 5.4
8
  License: GPLv2 or later
9
  License URI: http://www.gnu.org/licenses/gpl-2.0.html
@@ -74,6 +74,8 @@ The only requirement for this plugin is that you change the Permalink Structure
74
  * [Twenty Fifteen](https://wordpress.org/themes/twentyfifteen/)
75
  * [Twenty Sixteen](https://wordpress.org/themes/twentysixteen/)
76
  * [Twenty Seventeen](https://wordpress.org/themes/twentyseventeen/)
 
 
77
  * [Vantage](https://wordpress.org/themes/vantage/)
78
  * [Virtue](https://wordpress.org/themes/virtue/)
79
  * [Zerif Lite](http://themeisle.com/themes/zerif-lite/)
@@ -100,7 +102,19 @@ The only requirement for this plugin is that you change the Permalink Structure
100
  = Action Hook =
101
  The plugin adds an action hook 404page_after_404 which you can use to add extra functionality. The exact position the action occurs after an 404 error is detected depends on the Operating Method. Your function must not generate any output. There are no parameters.
102
 
103
- = Native Support =
 
 
 
 
 
 
 
 
 
 
 
 
104
  If you are a theme developer you can add native support for the 404page plugin to your theme for full control. [Read more](http://petersplugins.com/docs/404page/#theme_native_support).
105
 
106
  == Do you like this plugin? ==
@@ -157,6 +171,10 @@ Please use the [Support Forum](https://wordpress.org/support/plugin/404page).
157
 
158
  == Changelog ==
159
 
 
 
 
 
160
  = 11.0.5 (2019-10-22) =
161
  * bugfix for Yoast SEO XML Sitemap ([see topic](https://wordpress.org/support/topic/small-bug-with-wpseo_exclude_from_sitemap_by_post_ids/))
162
  * added a note to settings page if Yoast SEO is active
@@ -308,6 +326,10 @@ Please use the [Support Forum](https://wordpress.org/support/plugin/404page).
308
 
309
  == Upgrade Notice ==
310
 
 
 
 
 
311
  = 11.0.5 =
312
  bugfix for Yoast SEO XML Sitemap
313
 
2
  Contributors: petersplugins
3
  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, classicpress
4
  Requires at least: 4.0
5
+ Tested up to: 5.3
6
+ Stable tag: 11.1.0
7
  Requires PHP: 5.4
8
  License: GPLv2 or later
9
  License URI: http://www.gnu.org/licenses/gpl-2.0.html
74
  * [Twenty Fifteen](https://wordpress.org/themes/twentyfifteen/)
75
  * [Twenty Sixteen](https://wordpress.org/themes/twentysixteen/)
76
  * [Twenty Seventeen](https://wordpress.org/themes/twentyseventeen/)
77
+ * [Twenty Nineteen](https://wordpress.org/themes/twentynineteen/)
78
+ * [Twenty Twenty]
79
  * [Vantage](https://wordpress.org/themes/vantage/)
80
  * [Virtue](https://wordpress.org/themes/virtue/)
81
  * [Zerif Lite](http://themeisle.com/themes/zerif-lite/)
102
  = Action Hook =
103
  The plugin adds an action hook 404page_after_404 which you can use to add extra functionality. The exact position the action occurs after an 404 error is detected depends on the Operating Method. Your function must not generate any output. There are no parameters.
104
 
105
+ = Constant =
106
+ If the 404page plugin is installed and activated it defines the PHP constant PP_404. Check existence of it to detect the 404page plugin.
107
+
108
+ = Functions =
109
+ The Plugin provides the following functions:
110
+
111
+ * pp_404_is_active() to check if there is a custom 404 page selected and the selected page exists
112
+ * pp_404_get_page_id() to get the ID of the 404 page
113
+ * pp_404_get_all_page_ids() to get an array of page IDs in all languages
114
+
115
+ [Read more](http://petersplugins.com/docs/404page/#functions)
116
+
117
+ = Native Mode =
118
  If you are a theme developer you can add native support for the 404page plugin to your theme for full control. [Read more](http://petersplugins.com/docs/404page/#theme_native_support).
119
 
120
  == Do you like this plugin? ==
171
 
172
  == Changelog ==
173
 
174
+ = 11.1.0 (2019-11-10) =
175
+ * now uses Plugin Foundation PPF02 for plugin compatibility
176
+ * introduces two new functions for developers pp_404_get_page_id() and pp_404_get_all_page_ids()
177
+
178
  = 11.0.5 (2019-10-22) =
179
  * bugfix for Yoast SEO XML Sitemap ([see topic](https://wordpress.org/support/topic/small-bug-with-wpseo_exclude_from_sitemap_by_post_ids/))
180
  * added a note to settings page if Yoast SEO is active
326
 
327
  == Upgrade Notice ==
328
 
329
+ = 11.1.0 =
330
+ Plugin Foundation updated to version PPF02
331
+ two new functions for developers
332
+
333
  = 11.0.5 =
334
  bugfix for Yoast SEO XML Sitemap
335