WordPress.org

Plugin Directory

Changeset 1741444


Ignore:
Timestamp:
10/05/17 09:35:56 (2 weeks ago)
Author:
petersplugins
Message:

v 3.2 - new feature to send an HTTP 410 error for objects in trash

Location:
404page
Files:
17 added
3 edited

Legend:

Unmodified
Added
Removed
  • 404page/trunk/404page.php

    r1701593 r1741444  
    1010 * Plugin URI: http://petersplugins.com/free-wordpress-plugins/404page/ 
    1111 * Description: Custom 404 the easy way! Set any page as custom 404 error page. No coding needed. Works with (almost) every Theme. 
    12  * Version: 3.1 
     12 * Version: 3.2 
    1313 * Author: Peter Raschendorfer 
    1414 * Author URI: http://petersplugins.com 
  • 404page/trunk/inc/class-404page.php

    r1701593 r1741444  
    4545      $this->plugin_name = '404page'; 
    4646      $this->plugin_slug = '404page'; 
    47       $this->version = '3.1'; 
     47      $this->version = '3.2'; 
    4848      $this->get_settings(); 
    4949      $this->load(); 
     
    6363      $this->settings['404page_force_error'] = $this->get_404page_force_error(); 
    6464      $this->settings['404page_no_url_guessing'] = $this->get_404page_no_url_guessing(); 
     65      $this->settings['404page_http410_if_trashed'] = $this->get_404page_http410_if_trashed(); 
    6566      $this->settings['404page_native'] = false; 
    6667    } 
     
    146147         
    147148        // Customizr Compatibility Mode  
    148         
     149 
    149150        // @since 3.1 
    150151        add_filter( 'body_class', array( $this, 'add_404_body_class_customizr_mode' ) ); 
     152         
    151153        add_filter( 'tc_404_header_content', array( $this, 'show404title_customizr_mode' ), 999 ); 
    152154        add_filter( 'tc_404_content', array( $this, 'show404_customizr_mode' ), 999 ); 
    153155        add_filter( 'tc_404_selectors', array( $this, 'show404articleselectors_customizr_mode' ), 999 ); 
    154156         
     157        // send http 410 instead of http 404 if requested resource is in trash 
     158        // @since 3.2 
     159        if ( $this->settings['404page_http410_if_trashed'] ) { 
     160           
     161          add_action( 'template_redirect', array( $this, 'maybe_send_410' )     ); 
     162           
     163        } 
     164         
    155165      } elseif ( $this->settings['404page_method'] != 'STD' ) { 
    156166           
     
    166176        // Standard Mode 
    167177        add_filter( '404_template', array( $this, 'show404_standard_mode' ), 999 ); 
     178         
    168179        if ( $this->settings['404page_fire_error'] ) { 
     180           
    169181          add_action( 'template_redirect', array( $this, 'do_404_header_standard_mode' ) ); 
     182           
     183        } 
     184         
     185        // send http 410 instead of http 404 if requested resource is in trash 
     186        // @since 3.2 
     187        if ( $this->settings['404page_http410_if_trashed'] ) { 
     188           
     189          add_action( 'template_redirect', array( $this, 'maybe_send_410' )     ); 
     190           
    170191        } 
    171192           
     
    320341      // remove the action so we handle only the first query - no custom queries 
    321342      remove_action( 'wp', array( $this, 'do_404_header' ) ); 
    322       status_header( 404 ); 
     343       
     344      // send http 410 instead of http 404 if requested resource is in trash 
     345      // @since 3.2 
     346       
     347      if ( $this->settings['404page_http410_if_trashed'] && $this->is_url_in_trash( rawurldecode ( ( is_ssl() ? 'https://' : 'http://' ) . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'] ) ) ) { 
     348           
     349        status_header( 410 ); 
     350           
     351      } else { 
     352       
     353        status_header( 404 ); 
     354         
     355      } 
    323356      nocache_headers(); 
    324357    } 
     
    456489     
    457490    /** 
     491     * send http 410 instead of http 404 in case the requested URL can be found in trash 
     492     * @since 3.2 
     493     */ 
     494    function maybe_send_410() { 
     495             
     496      // we don't do anything if there is no 404 
     497      if ( is_404() ) { 
     498         
     499        if ( $this->is_url_in_trash( rawurldecode ( ( is_ssl() ? 'https://' : 'http://' ) . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'] ) ) ) { 
     500           
     501          status_header( 410 ); 
     502           
     503        } 
     504      } 
     505       
     506    } 
     507     
     508     
     509    /** 
    458510     * init admin  
    459511     */ 
     
    471523      register_setting( '404page_settings', '404page_force_error' ); 
    472524      register_setting( '404page_settings', '404page_no_url_guessing' ); 
     525      register_setting( '404page_settings', '404page_http410_if_trashed' ); 
    473526      add_settings_field( '404page_settings_404page', __( 'Page to be displayed as 404 page', '404page' ) . '&nbsp;<a class="dashicons dashicons-editor-help" href="' . $this->dc_url . '/#settings_select_page"></a>' , array( $this, 'admin_404page' ), '404page_settings_section', '404page-settings', array( 'label_for' => '404page_page_id' ) ); 
    474527      add_settings_field( '404page_settings_hide', '' , array( $this, 'admin_hide' ), '404page_settings_section_advanced', '404page-settings', array( 'label_for' => '404page_hide' ) ); 
     
    476529      add_settings_field( '404page_settings_force', '' , array( $this, 'admin_force404' ), '404page_settings_section_advanced', '404page-settings', array( 'label_for' => '404page_force_error' ) ); 
    477530      add_settings_field( '404page_settings_noguess', '' , array( $this, 'admin_noguess' ), '404page_settings_section_advanced', '404page-settings', array( 'label_for' => '404page_no_url_guessing' ) ); 
     531      add_settings_field( '404page_settings_http410', '' , array( $this, 'admin_http410' ), '404page_settings_section_advanced', '404page-settings', array( 'label_for' => '404page_http410_if_trashed' ) ); 
    478532      add_settings_field( '404page_settings_method', '', array( $this, 'admin_method' ), '404page_settings_section_advanced', '404page-settings', array( 'label_for' => '404page_method' ) ); 
    479533    } 
     
    579633     
    580634    /** 
     635     * handle the settings field to send an http 410 error in case the object is trashed 
     636     * @since 3.2 
     637     */ 
     638    function admin_http410() { 
     639       
     640      echo '<p><input type="checkbox" id="404page_http410_if_trashed" name="404page_http410_if_trashed" value="1"' . checked( true, $this->settings['404page_http410_if_trashed'], false ) . '/>'; 
     641      echo '<label for="404page_http410_if_trashed" class="check"></label>' . __( 'Send an HTTP 410 error instead of HTTP 404 in case the requested object is in trash', '404page' ) . '&nbsp;<a class="dashicons dashicons-editor-help" href="' . $this->dc_url . '/#settings_maybe_send_http410"></a><br />'; 
     642      echo '<span class="dashicons dashicons-info"></span>&nbsp;' . __( 'Check this if you want to inform search engines that the resource requested is no longer available and will not be available again so it can be removed from the search index immediately.', '404page' ); 
     643     
     644    } 
     645     
     646     
     647    /** 
    581648     * handle the settings field method 
    582649     */ 
     
    703770      return array_values( $pages ); 
    704771       
     772    } 
     773     
     774     
     775    /** 
     776     * check if the requested url is found in trash 
     777     * @since 3.2 
     778     * based on WP core function url_to_postid() 
     779     */ 
     780    function is_url_in_trash( $url ) { 
     781     
     782      global $wp_rewrite; 
     783      global $wp; 
     784     
     785      // First, check to see if there is a 'p=N' or 'page_id=N' to match against 
     786      if ( preg_match( '#[?&](p|page_id|attachment_id)=(\d+)#', $url, $values ) ) { 
     787         
     788        $id = absint( $values[2] ); 
     789         
     790        if ( $id ) { 
     791           
     792          if ( 'trash' == get_post_status( $id ) ) { 
     793             
     794            return true; 
     795           
     796          } else { 
     797             
     798            return false; 
     799           
     800          } 
     801           
     802        } 
     803         
     804      } 
     805       
     806      // Check to see if we are using rewrite rules 
     807      $rewrite = $wp_rewrite->wp_rewrite_rules(); 
     808       
     809      // Not using rewrite rules, and 'p=N' and 'page_id=N' methods failed, so we're out of options 
     810      if ( empty( $rewrite ) ) { 
     811         
     812        return false; 
     813         
     814      } 
     815           
     816      // Get rid of the #anchor 
     817      $url_split = explode('#', $url); 
     818      $url = $url_split[0]; 
     819       
     820      // Get rid of URL ?query=string 
     821      $url_split = explode('?', $url); 
     822      $url = $url_split[0]; 
     823       
     824      // Add 'www.' if it is absent and should be there 
     825      if ( false !== strpos( home_url(), '://www.' ) && false === strpos( $url, '://www.' ) ) { 
     826       
     827        $url = str_replace('://', '://www.', $url); 
     828       
     829      } 
     830       
     831      // Strip 'www.' if it is present and shouldn't be 
     832      if ( false === strpos( home_url(), '://www.' ) ) { 
     833         
     834        $url = str_replace('://www.', '://', $url); 
     835         
     836      } 
     837     
     838      // Strip 'index.php/' if we're not using path info permalinks 
     839      if ( !$wp_rewrite->using_index_permalinks() ) { 
     840         
     841        $url = str_replace( $wp_rewrite->index . '/', '', $url ); 
     842         
     843      } 
     844     
     845   
     846      if ( false !== strpos( trailingslashit( $url ), home_url( '/' ) ) ) { 
     847         
     848        // Chop off http://domain.com/[path] 
     849        $url = str_replace(home_url(), '', $url); 
     850       
     851      } else { 
     852         
     853        // Chop off /path/to/blog 
     854        $home_path = parse_url( home_url( '/' ) ); 
     855        $home_path = isset( $home_path['path'] ) ? $home_path['path'] : '' ; 
     856        $url = preg_replace( sprintf( '#^%s#', preg_quote( $home_path ) ), '', trailingslashit( $url ) ); 
     857       
     858      } 
     859     
     860      // Trim leading and lagging slashes 
     861      $url = trim($url, '/'); 
     862     
     863      $request = $url; 
     864      $post_type_query_vars = array(); 
     865       
     866      foreach ( get_post_types( array() , 'objects' ) as $post_type => $t ) { 
     867         
     868        if ( ! empty( $t->query_var ) ) { 
     869           
     870          $post_type_query_vars[ $t->query_var ] = $post_type; 
     871           
     872        } 
     873      } 
     874     
     875      // Look for matches. 
     876      $request_match = $request; 
     877      foreach ( (array)$rewrite as $match => $query) { 
     878         
     879        // If the requesting file is the anchor of the match, prepend it 
     880        // to the path info. 
     881        if ( !empty( $url ) && ( $url != $request ) && ( strpos( $match, $url ) === 0 ) ) { 
     882             
     883          $request_match = $url . '/' . $request; 
     884           
     885        } 
     886         
     887        if ( preg_match( "#^$match#", $request_match, $matches ) ) { 
     888             
     889          if ( $wp_rewrite->use_verbose_page_rules && preg_match( '/pagename=\$matches\[([0-9]+)\]/', $query, $varmatch ) ) { 
     890                 
     891            // This is a verbose page match, let's check to be sure about it. 
     892            if ( ! get_page_by_path( $matches[ $varmatch[1] ] ) ) { 
     893                     
     894              continue; 
     895               
     896            } 
     897          } 
     898 
     899          // Got a match. 
     900             
     901          // Trim the query of everything up to the '?'. 
     902          $query = preg_replace( "!^.+\?!", '', $query ); 
     903             
     904          // Substitute the substring matches into the query. 
     905          $query = addslashes( WP_MatchesMapRegex::apply( $query, $matches ) ); 
     906             
     907          // Filter out non-public query vars 
     908          parse_str( $query, $query_vars ); 
     909          $query = array(); 
     910           
     911          foreach ( (array) $query_vars as $key => $value ) { 
     912           
     913            if ( in_array( $key, $wp->public_query_vars ) ) { 
     914                     
     915              $query[$key] = $value; 
     916                     
     917              if ( isset( $post_type_query_vars[$key] ) ) { 
     918                         
     919                $query['post_type'] = $post_type_query_vars[$key]; 
     920                $query['name'] = $value; 
     921                     
     922              } 
     923               
     924            } 
     925             
     926          } 
     927           
     928          // Magic 
     929          if ( isset( $query['pagename'] ) ) { 
     930            
     931            $query['pagename'] .= '__trashed' ; 
     932             
     933          } 
     934           
     935          if ( isset( $query['name'] ) ) { 
     936 
     937            $query['name'] .= '__trashed' ; 
     938             
     939          } 
     940           
     941          $query['post_status'] = array( 'trash' ); 
     942           
     943          // Resolve conflicts between posts with numeric slugs and date archive queries. 
     944          $query = wp_resolve_numeric_slug_conflicts( $query ); 
     945           
     946          // Do the query 
     947          $query = new WP_Query( $query ); 
     948           
     949          if ( $query->found_posts == 1 ) { 
     950                 
     951            return true; 
     952             
     953          } else { 
     954                 
     955            return false; 
     956             
     957          } 
     958         
     959        } 
     960       
     961      } 
     962     
     963      return false; 
     964 
    705965    } 
    706966     
     
    9091169     
    9101170    /** 
     1171     * do we have to send an http 410 error in case the object is in trash? 
     1172     * @since 3.2 
     1173     */ 
     1174    private function get_404page_http410_if_trashed() { 
     1175       
     1176      return (bool)get_option( '404page_http410_if_trashed', false ); 
     1177       
     1178    } 
     1179     
     1180     
     1181    /** 
    9111182     * get the id of the 404 page in the current language if WPML or Polylang is active 
    9121183     */ 
  • 404page/trunk/readme.txt

    r1722430 r1741444  
    55Requires at least: 3.0 
    66Tested up to: 4.8 
    7 Stable tag: 3.1 
     7Stable tag: 3.2 
    88License: GPLv2 or later 
    99License URI: http://www.gnu.org/licenses/gpl-2.0.html 
     
    116116== Changelog == 
    117117 
     118= 3.2 (2017-10-05) = 
     119* new feature to send an HTTP 410 error for deleted objects 
     120 
    118121= 3.1 (2017-07-24) = 
    119122* bugfix for Polylang ([See Topic](https://wordpress.org/support/topic/3-0-breaks-polylang-support/)) 
     
    197200== Upgrade Notice == 
    198201 
     202= 3.2 = 
     203new feature to send an HTTP 410 error for deleted objects 
     204 
    199205= 3.1 = 
    200206fixed two bugs, plus further enhancements 
Note: See TracChangeset for help on using the changeset viewer.