match' => $parsed_url['host'], // This is handled by self::verify_ssl_certificate(). 'capture_peer_cert' => $ssl_verify, 'SNI_enabled' => true, 'cafile' => $parsed_args['sslcertificates'], 'allow_self_signed' => ! $ssl_verify, ), ) ); $timeout = (int) floor( $parsed_args['timeout'] ); $utimeout = 0; if ( $timeout !== (int) $parsed_args['timeout'] ) { $utimeout = 1000000 * $parsed_args['timeout'] % 1000000; } $connect_timeout = max( $timeout, 1 ); // Store error number. $connection_error = null; // Store error string. $connection_error_str = null; if ( ! WP_DEBUG ) { // In the event that the SSL connection fails, silence the many PHP warnings. if ( $secure_transport ) { $error_reporting = error_reporting( 0 ); } if ( $proxy->is_enabled() && $proxy->send_through_proxy( $url ) ) { // phpcs:ignore WordPress.PHP.NoSilencedErrors.Discouraged $handle = @stream_socket_client( 'tcp://' . $proxy->host() . ':' . $proxy->port(), $connection_error, $connection_error_str, $connect_timeout, STREAM_CLIENT_CONNECT, $context ); } else { // phpcs:ignore WordPress.PHP.NoSilencedErrors.Discouraged $handle = @stream_socket_client( $connect_host . ':' . $parsed_url['port'], $connection_error, $connection_error_str, $connect_timeout, STREAM_CLIENT_CONNECT, $context ); } if ( $secure_transport ) { error_reporting( $error_reporting ); } } else { if ( $proxy->is_enabled() && $proxy->send_through_proxy( $url ) ) { $handle = stream_socket_client( 'tcp://' . $proxy->host() . ':' . $proxy->port(), $connection_error, $connection_error_str, $connect_timeout, STREAM_CLIENT_CONNECT, $context ); } else { $handle = stream_socket_client( $connect_host . ':' . $parsed_url['port'], $connection_error, $connection_error_str, $connect_timeout, STREAM_CLIENT_CONNECT, $context ); } } if ( false === $handle ) { // SSL connection failed due to expired/invalid cert, or, OpenSSL configuration is broken. if ( $secure_transport && 0 === $connection_error && '' === $connection_error_str ) { return new WP_Error( 'http_request_failed', __( 'The SSL certificate for the host could not be verified.' ) ); } return new WP_Error( 'http_request_failed', $connection_error . ': ' . $connection_error_str ); } // Verify that the SSL certificate is valid for this request. if ( $secure_transport && $ssl_verify && ! $proxy->is_enabled() ) { if ( ! self::verify_ssl_certificate( $handle, $parsed_url['host'] ) ) { return new WP_Error( 'http_request_failed', __( 'The SSL certificate for the host could not be verified.' ) ); } } stream_set_timeout( $handle, $timeout, $utimeout ); if ( $proxy->is_enabled() && $proxy->send_through_proxy( $url ) ) { // Some proxies require full URL in this field. $request_path = $url; } else { $request_path = $parsed_url['path'] . ( isset( $parsed_url['query'] ) ? '?' . $parsed_url['query'] : '' ); } $headers = strtoupper( $parsed_args['method'] ) . ' ' . $request_path . ' HTTP/' . $parsed_args['httpversion'] . "\r\n"; $include_port_in_host_header = ( ( $proxy->is_enabled() && $proxy->send_through_proxy( $url ) ) || ( 'http' === $parsed_url['scheme'] && 80 !== $parsed_url['port'] ) || ( 'https' === $parsed_url['scheme'] && 443 !== $parsed_url['port'] ) ); if ( $include_port_in_host_header ) { $headers .= 'Host: ' . $parsed_url['host'] . ':' . $parsed_url['port'] . "\r\n"; } else { $headers .= 'Host: ' . $parsed_url['host'] . "\r\n"; } if ( isset( $parsed_args['user-agent'] ) ) { $headers .= 'User-agent: ' . $parsed_args['user-agent'] . "\r\n"; } if ( is_array( $parsed_args['headers'] ) ) { foreach ( (array) $parsed_args['headers'] as $header => $header_value ) { $headers .= $header . ': ' . $header_value . "\r\n"; } } else { $headers .= $parsed_args['headers']; } if ( $proxy->use_authentication() ) { $headers .= $proxy->authentication_header() . "\r\n"; } $headers .= "\r\n"; if ( ! is_null( $parsed_args['body'] ) ) { $headers .= $parsed_args['body']; } fwrite( $handle, $headers ); if ( ! $parsed_args['blocking'] ) { stream_set_blocking( $handle, 0 ); fclose( $handle ); return array( 'headers' => array(), 'body' => '', 'response' => array( 'code' => false, 'message' => false, ), 'cookies' => array(), ); } $response = ''; $body_started = false; $keep_reading = true; $block_size = 4096; if ( isset( $parsed_args['limit_response_size'] ) ) { $block_size = min( $block_size, $parsed_args['limit_response_size'] ); } // If streaming to a file setup the file handle. if ( $parsed_args['stream'] ) { if ( ! WP_DEBUG ) { $stream_handle = @fopen( $parsed_args['filename'], 'w+' ); } else { $stream_handle = fopen( $parsed_args['filename'], 'w+' ); } if ( ! $stream_handle ) { return new WP_Error( 'http_request_failed', sprintf( /* translators: 1: fopen(), 2: File name. */ __( 'Could not open handle for %1$s to %2$s.' ), 'fopen()', $parsed_args['filename'] ) ); } $bytes_written = 0; while ( ! feof( $handle ) && $keep_reading ) { $block = fread( $handle, $block_size ); if ( ! $body_started ) { $response .= $block; if ( strpos( $response, "\r\n\r\n" ) ) { $processed_response = WP_Http::processResponse( $response ); $body_started = true; $block = $processed_response['body']; unset( $response ); $processed_response['body'] = ''; } } $this_block_size = strlen( $block ); if ( isset( $parsed_args['limit_response_size'] ) && ( $bytes_written + $this_block_size ) > $parsed_args['limit_response_size'] ) { $this_block_size = ( $parsed_args['limit_response_size'] - $bytes_written ); $block = substr( $block, 0, $this_block_size ); } $bytes_written_to_file = fwrite( $stream_handle, $block ); if ( $bytes_written_to_file !== $this_block_size ) { fclose( $handle ); fclose( $stream_handle ); return new WP_Error( 'http_request_failed', __( 'Failed to write request to temporary file.' ) ); } $bytes_written += $bytes_written_to_file; $keep_reading = ( ! isset( $parsed_args['limit_response_size'] ) || $bytes_written < $parsed_args['limit_response_size'] ); } fclose( $stream_handle ); } else { $header_length = 0; while ( ! feof( $handle ) && $keep_reading ) { $block = fread( $handle, $block_size ); $response .= $block; if ( ! $body_started && strpos( $response, "\r\n\r\n" ) ) { $header_length = strpos( $response, "\r\n\r\n" ) + 4; $body_started = true; } $keep_reading = ( ! $body_started || ! isset( $parsed_args['limit_response_size'] ) || strlen( $response ) < ( $header_length + $parsed_args['limit_response_size'] ) ); } $processed_response = WP_Http::processResponse( $response ); unset( $response ); } fclose( $handle ); $processed_headers = WP_Http::processHeaders( $processed_response['headers'], $url ); $response = array( 'headers' => $processed_headers['headers'], // Not yet processed. 'body' => null, 'response' => $processed_headers['response'], 'cookies' => $processed_headers['cookies'], 'filename' => $parsed_args['filename'], ); // Handle redirects. $redirect_response = WP_Http::handle_redirects( $url, $parsed_args, $response ); if ( false !== $redirect_response ) { return $redirect_response; } // If the body was chunk encoded, then decode it. if ( ! empty( $processed_response['body'] ) && isset( $processed_headers['headers']['transfer-encoding'] ) && 'chunked' === $processed_headers['headers']['transfer-encoding'] ) { $processed_response['body'] = WP_Http::chunkTransferDecode( $processed_response['body'] ); } if ( true === $parsed_args['decompress'] && true === WP_Http_Encoding::should_decode( $processed_headers['headers'] ) ) { $processed_response['body'] = WP_Http_Encoding::decompress( $processed_response['body'] ); } if ( isset( $parsed_args['limit_response_size'] ) && strlen( $processed_response['body'] ) > $parsed_args['limit_response_size'] ) { $processed_response['body'] = substr( $processed_response['body'], 0, $parsed_args['limit_response_size'] ); } $response['body'] = $processed_response['body']; return $response; } /** * Verifies the received SSL certificate against its Common Names and subjectAltName fields. * * PHP's SSL verifications only verify that it's a valid Certificate, it doesn't verify if * the certificate is valid for the hostname which was requested. * This function verifies the requested hostname against certificate's subjectAltName field, * if that is empty, or contains no DNS entries, a fallback to the Common Name field is used. * * IP Address support is included if the request is being made to an IP address. * * @since 3.7.0 * * @param resource $stream The PHP Stream which the SSL request is being made over * @param string $host The hostname being requested * @return bool If the certificate presented in $stream is valid for $host */ public static function verify_ssl_certificate( $stream, $host ) { $context_options = stream_context_get_options( $stream ); if ( empty( $context_options['ssl']['peer_certificate'] ) ) { return false; } $cert = openssl_x509_parse( $context_options['ssl']['peer_certificate'] ); if ( ! $cert ) { return false; } /* * If the request is being made to an IP address, we'll validate against IP fields * in the cert (if they exist) */ $host_type = ( WP_Http::is_ip_address( $host ) ? 'ip' : 'dns' ); $certificate_hostnames = array(); if ( ! empty( $cert['extensions']['subjectAltName'] ) ) { $match_against = preg_split( '/,\s*/', $cert['extensions']['subjectAltName'] ); foreach ( $match_against as $match ) { list( $match_type, $match_host ) = explode( ':', $match ); if ( strtolower( trim( $match_type ) ) === $host_type ) { // IP: or DNS: $certificate_hostnames[] = strtolower( trim( $match_host ) ); } } } elseif ( ! empty( $cert['subject']['CN'] ) ) { // Only use the CN when the certificate includes no subjectAltName extension. $certificate_hostnames[] = strtolower( $cert['subject']['CN'] ); } // Exact hostname/IP matches. if ( in_array( strtolower( $host ), $certificate_hostnames, true ) ) { return true; } // IP's can't be wildcards, Stop processing. if ( 'ip' === $host_type ) { return false; } // Test to see if the domain is at least 2 deep for wildcard support. if ( substr_count( $host, '.' ) < 2 ) { return false; } // Wildcard subdomains certs (*.example.com) are valid for a.example.com but not a.b.example.com. $wildcard_host = preg_replace( '/^[^.]+\./', '*.', $host ); return in_array( strtolower( $wildcard_host ), $certificate_hostnames, true ); } /** * Determines whether this class can be used for retrieving a URL. * * @since 2.7.0 * @since 3.7.0 Combined with the fsockopen transport and switched to stream_socket_client(). * * @param array $args Optional. Array of request arguments. Default empty array. * @return bool False means this class can not be used, true means it can. */ public static function test( $args = array() ) { if ( ! function_exists( 'stream_socket_client' ) ) { return false; } $is_ssl = isset( $args['ssl'] ) && $args['ssl']; if ( $is_ssl ) { if ( ! extension_loaded( 'openssl' ) ) { return false; } if ( ! function_exists( 'openssl_x509_parse' ) ) { return false; } } /** * Filters whether streams can be used as a transport for retrieving a URL. * * @since 2.7.0 * * @param bool $use_class Whether the class can be used. Default true. * @param array $args Request arguments. */ return apply_filters( 'use_streams_transport', true, $args ); } } /** * Deprecated HTTP Transport method which used fsockopen. * * This class is not used, and is included for backward compatibility only. * All code should make use of WP_Http directly through its API. * * @see WP_HTTP::request * * @since 2.7.0 * @deprecated 3.7.0 Please use WP_HTTP::request() directly */ class WP_HTTP_Fsockopen extends WP_Http_Streams { // For backward compatibility for users who are using the class directly. } * * @since 4.1.5 * * @return void */ public function resetUserBBPress() { if ( function_exists( 'bbpress' ) ) { global $current_user; $current_user = null; } } /** * Removes the bbPress title filter when adding a new reply with empty title to avoid fatal error. * * * @since 4.3.1 * * @param string $title The post title. * @param int $id The post ID (optional - in order to fix an issue where other plugins/themes don't pass in the second arg). * @return string The post title. */ public function maybeRemoveBBPressReplyFilter( $title, $id = 0 ) { if ( function_exists( 'bbp_get_reply_post_type' ) && get_post_type( $id ) === bbp_get_reply_post_type() && aioseo()->helpers->isScreenBase( 'post' ) ) { remove_filter( 'the_title', 'bbp_get_reply_title_fallback', 2 ); } return $title; } /** * Duplicates the model when duplicate post is triggered. * * @since 4.1.1 * * @param integer $newPostId The new post ID. * @param \WP_Post $originalPost The original post object. * @return void */ public function duplicatePost( $newPostId, $originalPost = null ) { $originalPostId = is_object( $originalPost ) ? $originalPost->ID : $originalPost; $originalAioseoPost = Models\Post::getPost( $originalPostId ); if ( ! $originalAioseoPost->exists() ) { return; } $newAioseoPost = Models\Post::getPost( $newPostId ); $columns = $originalAioseoPost->getColumns(); foreach ( $columns as $column => $value ) { // Skip the ID column. if ( 'id' === $column ) { continue; } if ( 'post_id' === $column ) { $newAioseoPost->$column = $newPostId; continue; } $newAioseoPost->$column = $originalAioseoPost->$column; } $newAioseoPost->save(); } /** * Duplicates the model when rewrite and republish is triggered. * * @since 4.3.4 * * @param integer $postId The post ID. * @param string $metaKey The meta key. * @param mixed $metaValue The meta value. * @return void */ public function rewriteAndRepublish( $postId, $metaKey = '', $metaValue = '' ) { if ( '_dp_has_rewrite_republish_copy' !== $metaKey ) { return; } $originalPost = aioseo()->helpers->getPost( $postId ); if ( ! is_object( $originalPost ) ) { return; } $this->duplicatePost( (int) $metaValue, $originalPost ); } /** * Schedules an action to duplicate our meta after the duplicated WooCommerce product has been saved. * * @since 4.1.4 * * @param \WC_Product $newProduct The new, duplicated product. * @param \WC_Product $originalProduct The original product. * @return void */ public function scheduleDuplicateProduct( $newProduct, $originalProduct = null ) { self::$originalProductId = $originalProduct->get_id(); add_action( 'wp_insert_post', [ $this, 'duplicateProduct' ], 10, 2 ); } /** * Duplicates our meta for the new WooCommerce product. * * @since 4.1.4 * * @param integer $postId The new post ID. * @param \WP_Post $post The new post object. * @return void */ public function duplicateProduct( $postId, $post = null ) { if ( ! self::$originalProductId || 'product' !== $post->post_type ) { return; } $this->duplicatePost( $postId, self::$originalProductId ); } /** * Disable SEO inside the Genesis theme if it's running. * * @since 4.0.3 * * @param array $array An array of checks. * @return array An array with our function added. */ public function genesisTheme( $array ) { if ( empty( $array ) || ! isset( $array['functions'] ) ) { return $array; } $array['functions'][] = 'aioseo'; return $array; } /** * Remove XML from the GoDaddy CDN so our urls remain intact. * * @since 4.0.5 * * @param array $extensions The original extensions list. * @return array The extensions list without xml. */ public function goDaddySitemapXml( $extensions ) { $key = array_search( 'xml', $extensions, true ); unset( $extensions[ $key ] ); return $extensions; } /** * Registers our row meta for the plugins page. * * @since 4.0.0 * * @param array $actions List of existing actions. * @param string $pluginFile The plugin file. * @return array List of action links. */ abstract public function pluginRowMeta( $actions, $pluginFile = '' ); /** * Registers our action links for the plugins page. * * @since 4.0.0 * * @param array $actions List of existing actions. * @param string $pluginFile The plugin file. * @return array List of action links. */ abstract public function pluginActionLinks( $actions, $pluginFile = '' ); /** * Parses the action links. * * @since 4.0.0 * * @param array $actions The actions. * @param string $pluginFile The plugin file. * @param array $actionLinks The action links. * @param string $position The position. * @return array The parsed actions. */ protected function parseActionLinks( $actions, $pluginFile, $actionLinks = [], $position = 'after' ) { if ( empty( $this->plugin ) ) { $this->plugin = AIOSEO_PLUGIN_BASENAME; } if ( $this->plugin === $pluginFile && ! empty( $actionLinks ) ) { foreach ( $actionLinks as $key => $value ) { $link = [ $key => '' . $value['label'] . '' ]; $actions = 'after' === $position ? array_merge( $actions, $link ) : array_merge( $link, $actions ); } } return $actions; } /** * Add our routes to this plugins allow list. * * @since 4.1.4 * * @param array $allowList The original list. * @return array The modified list. */ public function allowRestRoutes( $allowList ) { return array_merge( $allowList, [ '/aioseo/' ] ); } /** * Clear the site authors cache when user is updated or registered. * * @since 4.1.8 * * @return void */ public function clearAuthorsCache() { aioseo()->core->cache->delete( 'site_authors' ); } /** * Filters out post types that aren't really public when getPublicPostTypes() is called. * * @since 4.1.9 * * @param array[object]|array[string] $postTypes The post types. * @return array[object]|array[string] The filtered post types. */ public function removeInvalidPublicPostTypes( $postTypes ) { $postTypesToRemove = [ 'fusion_element', // Avada 'elementor_library', 'redirect_rule', // Safe Redirect Manager 'seedprod' ]; foreach ( $postTypes as $index => $postType ) { if ( is_string( $postType ) && in_array( $postType, $postTypesToRemove, true ) ) { unset( $postTypes[ $index ] ); continue; } if ( is_array( $postType ) && in_array( $postType['name'], $postTypesToRemove, true ) ) { unset( $postTypes[ $index ] ); } } return array_values( $postTypes ); } /** * Filters out taxonomies that aren't really public when getPublicTaxonomies() is called. * * @since 4.2.4 * * @param array[object]|array[string] $taxonomies The taxonomies. * @return array[object]|array[string] The filtered taxonomies. */ public function removeInvalidPublicTaxonomies( $taxonomies ) { // Check if the Avada Builder plugin is enabled. if ( ! defined( 'FUSION_BUILDER_VERSION' ) ) { return $taxonomies; } $taxonomiesToRemove = [ 'fusion_tb_category', 'element_category', 'template_category' ]; foreach ( $taxonomies as $index => $taxonomy ) { if ( is_string( $taxonomy ) && in_array( $taxonomy, $taxonomiesToRemove, true ) ) { unset( $taxonomies[ $index ] ); continue; } if ( is_array( $taxonomy ) && in_array( $taxonomy['name'], $taxonomiesToRemove, true ) ) { unset( $taxonomies[ $index ] ); } } return array_values( $taxonomies ); } /** * Disable Jetpack sitemaps module. * * @since 4.2.2 */ public function disableJetpackSitemaps( $active ) { unset( $active['sitemaps'] ); return $active; } /** * Dequeues third-party scripts from the other plugins or themes that crashes our menu pages. * * @since 4.1.9 * @version 4.3.1 * * @return void */ public function dequeueThirdPartyAssets() { // TagDiv Opt-in Builder plugin. wp_dequeue_script( 'tds_js_vue_files_last' ); // MyListing theme. if ( function_exists( 'mylisting' ) ) { wp_dequeue_script( 'vuejs' ); wp_dequeue_script( 'theme-script-vendor' ); wp_dequeue_script( 'theme-script-main' ); } // Voxel theme. if ( class_exists( '\Voxel\Controllers\Assets_Controller' ) ) { wp_dequeue_script( 'vue' ); wp_dequeue_script( 'vx:backend.js' ); } // Meta tags for seo plugin. if ( class_exists( '\Pagup\MetaTags\Settings' ) ) { wp_dequeue_script( 'pmt__vuejs' ); wp_dequeue_script( 'pmt__script' ); } // Plugin: Wpbingo Core (By TungHV). if ( strpos( wp_styles()->query( 'bwp-lookbook-css' )->src ?? '', 'wpbingo' ) !== false ) { wp_dequeue_style( 'bwp-lookbook-css' ); } } /** * Dequeues third-party scripts from the other plugins or themes that crashes our menu pages. * * @version 4.3.2 * * @return void */ public function dequeueThirdPartyAssetsEarly() { // Disables scripts for plugins StmMotorsExtends and StmPostType. if ( class_exists( 'STM_Metaboxes' ) ) { remove_action( 'admin_enqueue_scripts', [ 'STM_Metaboxes', 'wpcfto_scripts' ] ); } // Disables scripts for LearnPress plugin. if ( function_exists( 'learn_press_admin_assets' ) ) { remove_action( 'admin_enqueue_scripts', [ learn_press_admin_assets(), 'load_scripts' ] ); } } /** * Removes the duplicate meta description tag from the Hello Elementor theme. * * @since 4.4.3 * * @link https://developers.elementor.com/docs/hello-elementor-theme/hello_elementor_add_description_meta_tag/ * * @return void */ public function removeHelloElementorDescriptionTag() { remove_action( 'wp_head', 'hello_elementor_add_description_meta_tag' ); } /** * Removes the Avada OG tags. * * @since 4.6.5 * * @return void */ public function removeAvadaOgTags() { if ( function_exists( 'Avada' ) ) { $avada = Avada(); if ( is_object( $avada->head ?? null ) ) { remove_action( 'wp_head', [ $avada->head, 'insert_og_meta' ], 5 ); } } } /** * Prevent WP-Optimize from deleting our tables. * * @since 4.4.5 * * @param array $tables List of tables. * @return array Filtered tables. */ public function wpOptimizeAioseoTables( $tables ) { foreach ( $tables as &$table ) { if ( is_object( $table ) && property_exists( $table, 'Name' ) && false !== stripos( $table->Name, 'aioseo_' ) ) { $table->is_using = true; $table->can_be_removed = false; } } return $tables; } }
Fatal error: Uncaught Error: Class "AIOSEO\Plugin\Common\Main\Filters" not found in /htdocs/wp-content/plugins/all-in-one-seo-pack/app/Lite/Main/Filters.php:16 Stack trace: #0 /htdocs/wp-content/plugins/all-in-one-seo-pack/vendor/composer/ClassLoader.php(576): include() #1 /htdocs/wp-content/plugins/all-in-one-seo-pack/vendor/composer/ClassLoader.php(427): Composer\Autoload\{closure}('/htdocs/wp-cont...') #2 /htdocs/wp-content/plugins/all-in-one-seo-pack/app/AIOSEO.php(323): Composer\Autoload\ClassLoader->loadClass('AIOSEO\\Plugin\\L...') #3 /htdocs/wp-content/plugins/all-in-one-seo-pack/app/AIOSEO.php(97): AIOSEO\Plugin\AIOSEO->load() #4 /htdocs/wp-content/plugins/all-in-one-seo-pack/app/AIOSEO.php(76): AIOSEO\Plugin\AIOSEO->init() #5 /htdocs/wp-content/plugins/all-in-one-seo-pack/app/AIOSEO.php(414): AIOSEO\Plugin\AIOSEO::instance() #6 /htdocs/wp-content/plugins/all-in-one-seo-pack/all_in_one_seo_pack.php(96): aioseo() #7 /htdocs/wp-settings.php(526): include_once('/htdocs/wp-cont...') #8 /htdocs/wp-config.php(85): require_once('/htdocs/wp-sett...') #9 /htdocs/wp-load.php(50): require_once('/htdocs/wp-conf...') #10 /htdocs/wp-blog-header.php(13): require_once('/htdocs/wp-load...') #11 /htdocs/index.php(17): require('/htdocs/wp-blog...') #12 {main} thrown in /htdocs/wp-content/plugins/all-in-one-seo-pack/app/Lite/Main/Filters.php on line 16