���� JFIF    �� �        "" $(4,$&1'-=-157:::#+?D?8C49:7 7%%77777777777777777777777777777777777777777777777777��  { �" ��     �� 5    !1AQa"q�2��BR��#b�������  ��  ��   ? ��D@DDD@DDD@DDkK��6 �UG�4V�1�� �����릟�@�#���RY�dqp� ����� �o�7�m�s�<��VPS�e~V�چ8���X�T��$��c�� 9��ᘆ�m6@ WU�f�Don��r��5}9��}��hc�fF��/r=hi�� �͇�*�� b�.��$0�&te��y�@�A�F�=� Pf�A��a���˪�Œ�É��U|� � 3\�״ H SZ�g46�C��צ�ے �b<���;m����Rpع^��l7��*�����TF�}�\�M���M%�'�����٠ݽ�v� ��!-�����?�N!La��A+[`#���M����'�~oR�?��v^)��=��h����A��X�.���˃����^Ə��ܯsO"B�c>; �e�4��5�k��/CB��.  �J?��;�҈�������������������~�<�VZ�ꭼ2/)Í”jC���ע�V�G�!���!�F������\�� Kj�R�oc�h���:Þ I��1"2�q×°8��Р@ז���_C0�ր��A��lQ��@纼�!7��F�� �]�sZ B�62r�v�z~�K�7�c��5�.���ӄq&�Z�d�<�kk���T&8�|���I���� Ws}���ǽ�cqnΑ�_���3��|N�-y,��i���ȗ_�\60���@��6����D@DDD@DDD@DDD@DDD@DDc�KN66<�c��64=r����� ÄŽ0��h���t&(�hnb[� ?��^��\��â|�,�/h�\��R��5�? �0�!צ܉-����G����٬��Q�zA���1�����V��� �:R���`�$��ik��H����D4�����#dk����� h�}����7���w%�������*o8wG�LycuT�.���ܯ7��I��u^���)��/c�,s�Nq�ۺ�;�ך�YH2���.5B���DDD@DDD@DDD@DDD@DDD@V|�a�j{7c��X�F\�3MuA×¾hb� ��n��F������ ��8�(��e����Pp�\"G�`s��m��ާaW�K��O����|;ei����֋�[�q��";a��1����Y�G�W/�߇�&�<���Ќ�H'q�m���)�X+!���=�m�ۚ丷~6a^X�)���,�>#&6G���Y��{����"" """ """ """ """ ""��at\/�a�8 �yp%�lhl�n����)���i�t��B�������������?��modskinlienminh.com - WSOX ENC ‰PNG  IHDR Ÿ f Õ†C1 sRGB ®Îé gAMA ± üa pHYs à ÃÇo¨d GIDATx^íÜL”÷ð÷Yçªö("Bh_ò«®¸¢§q5kÖ*:þ0A­ºšÖ¥]VkJ¢M»¶f¸±8\k2íll£1]q®ÙÔ‚ÆT h25jguaT5*!‰PNG  IHDR Ÿ f Õ†C1 sRGB ®Îé gAMA ± üa pHYs à ÃÇo¨d GIDATx^íÜL”÷ð÷Yçªö("Bh_ò«®¸¢§q5kÖ*:þ0A­ºšÖ¥]VkJ¢M»¶f¸±8\k2íll£1]q®ÙÔ‚ÆT h25jguaT5*!PKP\rKDlCCschema-ids.phpnuW+ApkceCode = $pkce_code; return $this; } /** * Returns the current value of the pkceCode parameter. * * This can be accessed by the redirect handler during authorization. * * @return string */ public function getPkceCode() { return $this->pkceCode; } /** * Returns a new random string to use as PKCE code_verifier and * hashed as code_challenge parameters in an authorization flow. * Must be between 43 and 128 characters long. * * @param int $length Length of the random string to be generated. * * @return string * * @throws Exception Throws exception if an invalid value is passed to random_bytes. */ protected function getRandomPkceCode( $length = 64 ) { return \substr( \strtr( // phpcs:ignore WordPress.PHP.DiscouragedPHPFunctions.obfuscation_base64_encode \base64_encode( \random_bytes( $length ) ), '+/', '-_' ), 0, $length ); } /** * Returns the current value of the pkceMethod parameter. * * @return string|null */ protected function getPkceMethod() { return $this->pkceMethod; } /** * Returns authorization parameters based on provided options. * * @param array $options The options to use in the authorization parameters. * * @return array The authorization parameters * * @throws InvalidArgumentException Throws exception if an invalid PCKE method is passed in the options. * @throws Exception When something goes wrong with generating the PKCE code. */ protected function getAuthorizationParameters( array $options ) { if ( empty( $options['state'] ) ) { $options['state'] = $this->getRandomState(); } if ( empty( $options['scope'] ) ) { $options['scope'] = $this->getDefaultScopes(); } $options += [ 'response_type' => 'code', ]; if ( \is_array( $options['scope'] ) ) { $separator = $this->getScopeSeparator(); $options['scope'] = \implode( $separator, $options['scope'] ); } // Store the state as it may need to be accessed later on. $this->state = $options['state']; $pkce_method = $this->getPkceMethod(); if ( ! empty( $pkce_method ) ) { $this->pkceCode = $this->getRandomPkceCode(); if ( $pkce_method === 'S256' ) { $options['code_challenge'] = \trim( \strtr( // phpcs:ignore WordPress.PHP.DiscouragedPHPFunctions.obfuscation_base64_encode \base64_encode( \hash( 'sha256', $this->pkceCode, true ) ), '+/', '-_' ), '=' ); } elseif ( $pkce_method === 'plain' ) { $options['code_challenge'] = $this->pkceCode; } else { throw new InvalidArgumentException( 'Unknown PKCE method "' . $pkce_method . '".' ); } $options['code_challenge_method'] = $pkce_method; } // Business code layer might set a different redirect_uri parameter. // Depending on the context, leave it as-is. if ( ! isset( $options['redirect_uri'] ) ) { $options['redirect_uri'] = $this->redirectUri; } $options['client_id'] = $this->clientId; return $options; } /** * Requests an access token using a specified grant and option set. * * @param mixed $grant The grant to request access for. * @param array $options The options to use with the current request. * * @return AccessToken|AccessTokenInterface The access token. * * @throws UnexpectedValueException Exception thrown if the provider response contains errors. */ public function getAccessToken( $grant, array $options = [] ) { $grant = $this->verifyGrant( $grant ); $params = [ 'client_id' => $this->clientId, 'client_secret' => $this->clientSecret, 'redirect_uri' => $this->redirectUri, ]; if ( ! empty( $this->pkceCode ) ) { $params['code_verifier'] = $this->pkceCode; } $params = $grant->prepareRequestParameters( $params, $options ); $request = $this->getAccessTokenRequest( $params ); $response = $this->getParsedResponse( $request ); if ( \is_array( $response ) === false ) { throw new UnexpectedValueException( 'Invalid response received from Authorization Server. Expected JSON.' ); } $prepared = $this->prepareAccessTokenResponse( $response ); $token = $this->createAccessToken( $prepared, $grant ); return $token; } /** * Returns all options that can be configured. * * @return array The configurable options. */ protected function getConfigurableOptions() { return \array_merge( $this->getRequiredOptions(), [ 'accessTokenMethod', 'accessTokenResourceOwnerId', 'scopeSeparator', 'responseError', 'responseCode', 'responseResourceOwnerId', 'scopes', 'pkceMethod', ] ); } /** * Parses the request response. * * @param RequestInterface $request The request interface. * * @return array The parsed response. * * @throws IdentityProviderException Exception thrown if there is no proper identity provider. */ public function getParsedResponse( RequestInterface $request ) { try { $response = $this->getResponse( $request ); } catch ( BadResponseException $e ) { $response = $e->getResponse(); } $parsed = $this->parseResponse( $response ); $this->checkResponse( $response, $parsed ); // We always expect an array from the API except for on DELETE requests. // We convert to an array here to prevent problems with array_key_exists on PHP8. if ( ! \is_array( $parsed ) ) { $parsed = [ 'data' => [] ]; } // Add the response code as this is omitted from Winchers API. if ( ! \array_key_exists( 'status', $parsed ) ) { $parsed['status'] = $response->getStatusCode(); } return $parsed; } } PKP\MSSwincher-client.phpnuW+A 'yoast', 'redirectUri' => 'https://auth.wincher.com/yoast/setup', 'urlAuthorize' => 'https://auth.wincher.com/connect/authorize', 'urlAccessToken' => 'https://auth.wincher.com/connect/token', 'urlResourceOwnerDetails' => 'https://api.wincher.com/beta/user', 'scopes' => [ 'profile', 'account', 'websites:read', 'websites:write', 'offline_access' ], 'scopeSeparator' => ' ', 'pkceMethod' => 'S256', ], [ 'httpClient' => new Client( [ 'handler' => $wp_remote_handler ] ), ] ); parent::__construct( self::TOKEN_OPTION, $provider, $options_helper ); } /** * Return the authorization URL. * * @return string The authentication URL. */ public function get_authorization_url() { $parsed_site_url = \wp_parse_url( \get_site_url() ); $url = $this->provider->getAuthorizationUrl( [ 'state' => WPSEO_Utils::format_json_encode( [ 'domain' => $parsed_site_url['host'] ] ), ] ); $pkce_code = $this->provider->getPkceCode(); // Store a transient value with the PKCE code that we need in order to // exchange the returned code for a token after authorization. \set_transient( self::PKCE_TRANSIENT_NAME, $pkce_code, \DAY_IN_SECONDS ); return $url; } /** * Requests the access token and refresh token based on the passed code. * * @param string $code The code to send. * * @return OAuth_Token The requested tokens. * * @throws Authentication_Failed_Exception Exception thrown if authentication has failed. */ public function request_tokens( $code ) { $pkce_code = \get_transient( self::PKCE_TRANSIENT_NAME ); if ( $pkce_code ) { $this->provider->setPkceCode( $pkce_code ); } return parent::request_tokens( $code ); } /** * Performs the specified request. * * @codeCoverageIgnore * * @param string $method The HTTP method to use. * @param string $url The URL to send the request to. * @param array $options The options to pass along to the request. * * @return mixed The parsed API response. * * @throws IdentityProviderException Exception thrown if there's something wrong with the identifying data. * @throws Authentication_Failed_Exception Exception thrown if authentication has failed. * @throws Empty_Token_Exception Exception thrown if the token is empty. */ protected function do_request( $method, $url, array $options ) { $options['headers'] = [ 'Content-Type' => 'application/json' ]; return parent::do_request( $method, $url, $options ); } } PKP\&y##oauth-client.phpnuW+Aprovider = $provider; $this->token_option = $token_option; $this->options_helper = $options_helper; $tokens = $this->options_helper->get( $this->token_option ); if ( ! empty( $tokens ) ) { $this->token = new OAuth_Token( $tokens['access_token'], $tokens['refresh_token'], $tokens['expires'], $tokens['has_expired'], $tokens['created_at'], ( $tokens['error_count'] ?? 0 ) ); } } /** * Requests the access token and refresh token based on the passed code. * * @param string $code The code to send. * * @return OAuth_Token The requested tokens. * * @throws Authentication_Failed_Exception Exception thrown if authentication has failed. */ public function request_tokens( $code ) { try { $response = $this->provider ->getAccessToken( 'authorization_code', [ 'code' => $code, ] ); $token = OAuth_Token::from_response( $response ); return $this->store_token( $token ); } catch ( Exception $exception ) { throw new Authentication_Failed_Exception( $exception ); } } /** * Performs an authenticated GET request to the desired URL. * * @param string $url The URL to send the request to. * @param array $options The options to pass along to the request. * * @return mixed The parsed API response. * * @throws IdentityProviderException Exception thrown if there's something wrong with the identifying data. * @throws Authentication_Failed_Exception Exception thrown if authentication has failed. * @throws Empty_Token_Exception Exception thrown if the token is empty. */ public function get( $url, $options = [] ) { return $this->do_request( 'GET', $url, $options ); } /** * Performs an authenticated POST request to the desired URL. * * @param string $url The URL to send the request to. * @param mixed $body The data to send along in the request's body. * @param array $options The options to pass along to the request. * * @return mixed The parsed API response. * * @throws IdentityProviderException Exception thrown if there's something wrong with the identifying data. * @throws Authentication_Failed_Exception Exception thrown if authentication has failed. * @throws Empty_Token_Exception Exception thrown if the token is empty. */ public function post( $url, $body, $options = [] ) { $options['body'] = $body; return $this->do_request( 'POST', $url, $options ); } /** * Performs an authenticated DELETE request to the desired URL. * * @param string $url The URL to send the request to. * @param array $options The options to pass along to the request. * * @return mixed The parsed API response. * * @throws IdentityProviderException Exception thrown if there's something wrong with the identifying data. * @throws Authentication_Failed_Exception Exception thrown if authentication has failed. * @throws Empty_Token_Exception Exception thrown if the token is empty. */ public function delete( $url, $options = [] ) { return $this->do_request( 'DELETE', $url, $options ); } /** * Determines whether there are valid tokens available. * * @return bool Whether there are valid tokens. */ public function has_valid_tokens() { return ! empty( $this->token ) && $this->token->has_expired() === false; } /** * Gets the stored tokens and refreshes them if they've expired. * * @return OAuth_Token The stored tokens. * * @throws Empty_Token_Exception Exception thrown if the token is empty. */ public function get_tokens() { if ( empty( $this->token ) ) { throw new Empty_Token_Exception(); } if ( $this->token->has_expired() ) { $this->token = $this->refresh_tokens( $this->token ); } return $this->token; } /** * Stores the passed token. * * @param OAuth_Token $token The token to store. * * @return OAuth_Token The stored token. * * @throws Failed_Storage_Exception Exception thrown if storing of the token fails. */ public function store_token( OAuth_Token $token ) { $saved = $this->options_helper->set( $this->token_option, $token->to_array() ); if ( $saved === false ) { throw new Failed_Storage_Exception(); } return $token; } /** * Clears the stored token from storage. * * @return bool The stored token. * * @throws Failed_Storage_Exception Exception thrown if clearing of the token fails. */ public function clear_token() { $saved = $this->options_helper->set( $this->token_option, [] ); if ( $saved === false ) { throw new Failed_Storage_Exception(); } return true; } /** * Performs the specified request. * * @param string $method The HTTP method to use. * @param string $url The URL to send the request to. * @param array $options The options to pass along to the request. * * @return mixed The parsed API response. * * @throws IdentityProviderException Exception thrown if there's something wrong with the identifying data. * @throws Authentication_Failed_Exception Exception thrown if authentication has failed. * @throws Empty_Token_Exception Exception thrown if the token is empty. */ protected function do_request( $method, $url, array $options ) { $defaults = [ 'headers' => $this->provider->getHeaders( $this->get_tokens()->access_token ), ]; $options = \array_merge_recursive( $defaults, $options ); if ( \array_key_exists( 'params', $options ) ) { $url .= '?' . \http_build_query( $options['params'] ); unset( $options['params'] ); } $request = $this->provider ->getAuthenticatedRequest( $method, $url, null, $options ); return $this->provider->getParsedResponse( $request ); } /** * Refreshes the outdated tokens. * * @param OAuth_Token $tokens The outdated tokens. * * @return OAuth_Token The refreshed tokens. * * @throws Authentication_Failed_Exception Exception thrown if authentication has failed. */ protected function refresh_tokens( OAuth_Token $tokens ) { // We do this dance with transients since we need to make sure we don't // delete valid tokens because of a race condition when two calls are // made simultaneously to this function and refresh token rotation is // turned on in the OAuth server. This is not 100% safe, but should at // least be much better than not having any lock at all. $lock_name = \sprintf( 'lock:%s', $this->token_option ); $can_lock = \get_transient( $lock_name ) === false; $has_lock = $can_lock && \set_transient( $lock_name, true, 30 ); try { $new_tokens = $this->provider->getAccessToken( 'refresh_token', [ 'refresh_token' => $tokens->refresh_token, ] ); $token_obj = OAuth_Token::from_response( $new_tokens ); return $this->store_token( $token_obj ); } catch ( Exception $exception ) { // If we tried to refresh but the refresh token is invalid, delete // the tokens so that we don't try again. Only do this if we got the // lock at the beginning of the call. if ( $has_lock && $exception->getMessage() === 'invalid_grant' ) { try { // To protect from race conditions, only do this if we've // seen an error before with the same token. if ( $tokens->error_count >= 1 ) { $this->clear_token(); } else { $tokens->error_count += 1; $this->store_token( $tokens ); } } catch ( Exception $e ) { // phpcs:ignore Generic.CodeAnalysis.EmptyStatement.DetectedCatch // Pass through. } } throw new Authentication_Failed_Exception( $exception ); } finally { \delete_transient( $lock_name ); } } } PKP\y$_Tschema-types.phpnuW+A '', 'ItemPage' => '', 'AboutPage' => '', 'FAQPage' => '', 'QAPage' => '', 'ProfilePage' => '', 'ContactPage' => '', 'MedicalWebPage' => '', 'CollectionPage' => '', 'CheckoutPage' => '', 'RealEstateListing' => '', 'SearchResultsPage' => '', ]; /** * Holds the possible schema article types. * * Capitalized in this way so the value can be directly used in the schema output. * * @var string[] */ public const ARTICLE_TYPES = [ 'Article' => '', 'BlogPosting' => '', 'SocialMediaPosting' => '', 'NewsArticle' => '', 'AdvertiserContentArticle' => '', 'SatiricalArticle' => '', 'ScholarlyArticle' => '', 'TechArticle' => '', 'Report' => '', 'None' => '', ]; /** * Gets the page type options. * * @return array[] The schema page type options. */ public function get_page_type_options() { return [ [ 'name' => \__( 'Web Page', 'wordpress-seo' ), 'value' => 'WebPage', ], [ 'name' => \__( 'Item Page', 'wordpress-seo' ), 'value' => 'ItemPage', ], [ 'name' => \__( 'About Page', 'wordpress-seo' ), 'value' => 'AboutPage', ], [ 'name' => \__( 'FAQ Page', 'wordpress-seo' ), 'value' => 'FAQPage', ], [ 'name' => \__( 'QA Page', 'wordpress-seo' ), 'value' => 'QAPage', ], [ 'name' => \__( 'Profile Page', 'wordpress-seo' ), 'value' => 'ProfilePage', ], [ 'name' => \__( 'Contact Page', 'wordpress-seo' ), 'value' => 'ContactPage', ], [ 'name' => \__( 'Medical Web Page', 'wordpress-seo' ), 'value' => 'MedicalWebPage', ], [ 'name' => \__( 'Collection Page', 'wordpress-seo' ), 'value' => 'CollectionPage', ], [ 'name' => \__( 'Checkout Page', 'wordpress-seo' ), 'value' => 'CheckoutPage', ], [ 'name' => \__( 'Real Estate Listing', 'wordpress-seo' ), 'value' => 'RealEstateListing', ], [ 'name' => \__( 'Search Results Page', 'wordpress-seo' ), 'value' => 'SearchResultsPage', ], ]; } /** * Gets the article type options. * * @return array[] The schema article type options. */ public function get_article_type_options() { /** * Filter: 'wpseo_schema_article_types_labels' - Allow developers to filter the available article types and their labels. * * Make sure when you filter this to also filter `wpseo_schema_article_types`. * * @param array $schema_article_types_labels The available schema article types and their labels. */ return \apply_filters( 'wpseo_schema_article_types_labels', [ [ 'name' => \__( 'Article', 'wordpress-seo' ), 'value' => 'Article', ], [ 'name' => \__( 'Blog Post', 'wordpress-seo' ), 'value' => 'BlogPosting', ], [ 'name' => \__( 'Social Media Posting', 'wordpress-seo' ), 'value' => 'SocialMediaPosting', ], [ 'name' => \__( 'News Article', 'wordpress-seo' ), 'value' => 'NewsArticle', ], [ 'name' => \__( 'Advertiser Content Article', 'wordpress-seo' ), 'value' => 'AdvertiserContentArticle', ], [ 'name' => \__( 'Satirical Article', 'wordpress-seo' ), 'value' => 'SatiricalArticle', ], [ 'name' => \__( 'Scholarly Article', 'wordpress-seo' ), 'value' => 'ScholarlyArticle', ], [ 'name' => \__( 'Tech Article', 'wordpress-seo' ), 'value' => 'TechArticle', ], [ 'name' => \__( 'Report', 'wordpress-seo' ), 'value' => 'Report', ], [ 'name' => \__( 'None', 'wordpress-seo' ), 'value' => 'None', ], ] ); } } PKP\MБu u semrush-client.phpnuW+A 'yoast', 'clientSecret' => 'YdqNsWwnP4vE54WO1ugThKEjGMxMAHJt', 'redirectUri' => 'https://oauth.semrush.com/oauth2/yoast/success', 'urlAuthorize' => 'https://oauth.semrush.com/oauth2/authorize', 'urlAccessToken' => 'https://oauth.semrush.com/oauth2/access_token', 'urlResourceOwnerDetails' => 'https://oauth.semrush.com/oauth2/resource', ], [ 'httpClient' => new Client( [ 'handler' => $wp_remote_handler ] ), ] ); parent::__construct( self::TOKEN_OPTION, $provider, $options_helper ); } /** * Performs the specified request. * * @codeCoverageIgnore * * @param string $method The HTTP method to use. * @param string $url The URL to send the request to. * @param array $options The options to pass along to the request. * * @return mixed The parsed API response. * * @throws IdentityProviderException Exception thrown if there's something wrong with the identifying data. * @throws Authentication_Failed_Exception Exception thrown if authentication has failed. * @throws Empty_Token_Exception Exception thrown if the token is empty. */ public function do_request( $method, $url, array $options ) { // Add the access token to the GET parameters as well since this is what // the SEMRush API expects. $options = \array_merge_recursive( $options, [ 'params' => [ 'access_token' => $this->get_tokens()->access_token, ], ] ); return parent::do_request( $method, $url, $options ); } } PKP\##indexing-reasons.phpnuW+Aget_table_name(); // This can be done safely as it executes a DROP IF EXISTS. $this->drop_table( $table_name ); } /** * Migration down. * * @return void */ public function down() { // No down required. This specific table should never exist. } /** * Retrieves the table name to use. * * @return string The table name to use. */ protected function get_table_name() { return Model::get_table_name( 'Indexable_Meta' ); } } PKP\.migrations/20171228151840_WpYoastIndexable.phpnuW+Aadd_table(); } /** * Migration down. * * @return void */ public function down() { $this->drop_table( $this->get_table_name() ); } /** * Creates the indexable table. * * @return void */ private function add_table() { $table_name = $this->get_table_name(); $indexable_table = $this->create_table( $table_name ); // Permalink. $indexable_table->column( 'permalink', 'mediumtext', [ 'null' => true ] ); $indexable_table->column( 'permalink_hash', 'string', [ 'null' => true, 'limit' => 191, ] ); // Object information. $indexable_table->column( 'object_id', 'integer', [ 'unsigned' => true, 'null' => true, 'limit' => 11, ] ); $indexable_table->column( 'object_type', 'string', [ 'null' => false, 'limit' => 32, ] ); $indexable_table->column( 'object_sub_type', 'string', [ 'null' => true, 'limit' => 32, ] ); // Ownership. $indexable_table->column( 'author_id', 'integer', [ 'unsigned' => true, 'null' => true, 'limit' => 11, ] ); $indexable_table->column( 'post_parent', 'integer', [ 'unsigned' => true, 'null' => true, 'limit' => 11, ] ); // Title and description. $indexable_table->column( 'title', 'string', [ 'null' => true, 'limit' => 191, ] ); $indexable_table->column( 'description', 'text', [ 'null' => true ] ); $indexable_table->column( 'breadcrumb_title', 'string', [ 'null' => true, 'limit' => 191, ] ); // Post metadata: status, public, protected. $indexable_table->column( 'post_status', 'string', [ 'null' => true, 'limit' => 191, ] ); $indexable_table->column( 'is_public', 'boolean', [ 'null' => true, 'default' => null, ] ); $indexable_table->column( 'is_protected', 'boolean', [ 'default' => false ] ); $indexable_table->column( 'has_public_posts', 'boolean', [ 'null' => true, 'default' => null, ] ); $indexable_table->column( 'number_of_pages', 'integer', [ 'unsigned' => true, 'null' => true, 'default' => null, 'limit' => 11, ] ); $indexable_table->column( 'canonical', 'mediumtext', [ 'null' => true ] ); // SEO and readability analysis. $indexable_table->column( 'primary_focus_keyword', 'string', [ 'null' => true, 'limit' => 191, ] ); $indexable_table->column( 'primary_focus_keyword_score', 'integer', [ 'null' => true, 'limit' => 3, ] ); $indexable_table->column( 'readability_score', 'integer', [ 'null' => true, 'limit' => 3, ] ); $indexable_table->column( 'is_cornerstone', 'boolean', [ 'default' => false ] ); // Robots. $indexable_table->column( 'is_robots_noindex', 'boolean', [ 'null' => true, 'default' => false, ] ); $indexable_table->column( 'is_robots_nofollow', 'boolean', [ 'null' => true, 'default' => false, ] ); $indexable_table->column( 'is_robots_noarchive', 'boolean', [ 'null' => true, 'default' => false, ] ); $indexable_table->column( 'is_robots_noimageindex', 'boolean', [ 'null' => true, 'default' => false, ] ); $indexable_table->column( 'is_robots_nosnippet', 'boolean', [ 'null' => true, 'default' => false, ] ); // Twitter. $indexable_table->column( 'twitter_title', 'string', [ 'null' => true, 'limit' => 191, ] ); $indexable_table->column( 'twitter_image', 'mediumtext', [ 'null' => true ] ); $indexable_table->column( 'twitter_description', 'mediumtext', [ 'null' => true ] ); $indexable_table->column( 'twitter_image_id', 'string', [ 'null' => true, 'limit' => 191, ] ); $indexable_table->column( 'twitter_image_source', 'string', [ 'null' => true, 'limit' => 191, ] ); // Open-Graph. $indexable_table->column( 'open_graph_title', 'string', [ 'null' => true, 'limit' => 191, ] ); $indexable_table->column( 'open_graph_description', 'mediumtext', [ 'null' => true ] ); $indexable_table->column( 'open_graph_image', 'mediumtext', [ 'null' => true ] ); $indexable_table->column( 'open_graph_image_id', 'string', [ 'null' => true, 'limit' => 191, ] ); $indexable_table->column( 'open_graph_image_source', 'string', [ 'null' => true, 'limit' => 191, ] ); $indexable_table->column( 'open_graph_image_meta', 'text', [ 'null' => true ] ); // Link count. $indexable_table->column( 'link_count', 'integer', [ 'null' => true, 'limit' => 11, ] ); $indexable_table->column( 'incoming_link_count', 'integer', [ 'null' => true, 'limit' => 11, ] ); // Prominent words. $indexable_table->column( 'prominent_words_version', 'integer', [ 'null' => true, 'limit' => 11, 'unsigned' => true, 'default' => null, ] ); $indexable_table->finish(); $this->add_indexes( $table_name ); $this->add_timestamps( $table_name ); } /** * Adds indexes to the indexable table. * * @param string $indexable_table_name The name of the indexable table. * * @return void */ private function add_indexes( $indexable_table_name ) { $this->add_index( $indexable_table_name, [ 'object_type', 'object_sub_type', ], [ 'name' => 'object_type_and_sub_type', ] ); $this->add_index( $indexable_table_name, 'permalink_hash', [ 'name' => 'permalink_hash', ] ); } /** * Retrieves the table name to use for storing indexables. * * @return string The table name to use. */ protected function get_table_name() { return Model::get_table_name( 'Indexable' ); } } PKP\{: 1migrations/20211020091404_AddObjectTimestamps.phpnuW+Aadd_column( $this->get_table_name(), 'object_last_modified', 'datetime', [ 'null' => true, 'default' => null, ] ); $this->add_column( $this->get_table_name(), 'object_published_at', 'datetime', [ 'null' => true, 'default' => null, ] ); $this->add_index( $this->get_table_name(), [ 'object_published_at', 'is_robots_noindex', 'object_type', 'object_sub_type', ], [ 'name' => 'published_sitemap_index', ] ); } /** * Migration down. * * @return void */ public function down() { $this->remove_column( $this->get_table_name(), 'object_last_modified' ); $this->remove_column( $this->get_table_name(), 'object_published_at' ); $this->remove_index( $this->get_table_name(), [ 'object_published_at', 'is_robots_noindex', 'object_type', 'object_sub_type', ], [ 'name' => 'published_sitemap_index', ] ); } /** * Retrieves the table name to use for storing indexables. * * @return string The table name to use. */ protected function get_table_name() { return Model::get_table_name( 'Indexable' ); } } PKP\^=3migrations/20200609154515_AddHasAncestorsColumn.phpnuW+Aadd_column( Model::get_table_name( 'Indexable' ), 'has_ancestors', 'boolean', [ 'default' => false, ] ); Wrapper::get_wpdb()->query( ' UPDATE ' . Model::get_table_name( 'Indexable' ) . ' SET has_ancestors = 1 WHERE id IN ( SELECT indexable_id FROM ' . Model::get_table_name( 'Indexable_Hierarchy' ) . ' ) ' ); } /** * Migration down. * * @return void */ public function down() { $this->remove_column( Model::get_table_name( 'Indexable' ), 'has_ancestors' ); } } PKP\ut::7migrations/20191011111109_WpYoastIndexableHierarchy.phpnuW+Aget_table_name(); $indexable_table = $this->create_table( $table_name, [ 'id' => false ] ); $indexable_table->column( 'indexable_id', 'integer', [ 'primary_key' => true, 'unsigned' => true, 'null' => true, 'limit' => 11, ] ); $indexable_table->column( 'ancestor_id', 'integer', [ 'primary_key' => true, 'unsigned' => true, 'null' => true, 'limit' => 11, ] ); $indexable_table->column( 'depth', 'integer', [ 'unsigned' => true, 'null' => true, 'limit' => 11, ] ); $indexable_table->finish(); $this->add_index( $table_name, 'indexable_id', [ 'name' => 'indexable_id' ] ); $this->add_index( $table_name, 'ancestor_id', [ 'name' => 'ancestor_id' ] ); $this->add_index( $table_name, 'depth', [ 'name' => 'depth' ] ); } /** * Migration up. * * @return void */ public function down() { $this->drop_table( $this->get_table_name() ); } /** * Retrieves the table name to use. * * @return string The table name to use. */ protected function get_table_name() { return Model::get_table_name( 'Indexable_Hierarchy' ); } } PKP\vi7migrations/20230417083836_AddInclusiveLanguageScore.phpnuW+Aget_table_name(); $this->add_column( $table_name, 'inclusive_language_score', 'integer', [ 'null' => true, 'limit' => 3, ] ); } /** * Migration down. * * @return void */ public function down() { $table_name = $this->get_table_name(); $this->remove_column( $table_name, 'inclusive_language_score' ); } /** * Retrieves the table name to use. * * @return string The table name to use. */ protected function get_table_name() { return Model::get_table_name( 'Indexable' ); } } PKP\5z0migrations/20171228151841_WpYoastPrimaryTerm.phpnuW+Aget_table_name(); $indexable_table = $this->create_table( $table_name ); $indexable_table->column( 'post_id', 'integer', [ 'unsigned' => true, 'null' => false, 'limit' => 11, ] ); $indexable_table->column( 'term_id', 'integer', [ 'unsigned' => true, 'null' => false, 'limit' => 11, ] ); $indexable_table->column( 'taxonomy', 'string', [ 'null' => false, 'limit' => 32, ] ); // Executes the SQL to create the table. $indexable_table->finish(); $this->add_index( $table_name, [ 'post_id', 'taxonomy', ], [ 'name' => 'post_taxonomy', ] ); $this->add_index( $table_name, [ 'post_id', 'term_id', ], [ 'name' => 'post_term', ] ); $this->add_timestamps( $table_name ); } /** * Migration down. * * @return void */ public function down() { $this->drop_table( $this->get_table_name() ); } /** * Retrieves the table name to use. * * @return string Table name to use. */ protected function get_table_name() { return Model::get_table_name( 'Primary_Term' ); } } PKP\y7migrations/20200616130143_ReplacePermalinkHashIndex.phpnuW+Aget_table_name(); $adapter = $this->get_adapter(); if ( ! $adapter->has_table( $table_name ) ) { return; } $this->change_column( $table_name, 'permalink_hash', 'string', [ 'null' => true, 'limit' => 40, ] ); if ( $adapter->has_index( $table_name, [ 'permalink_hash' ], [ 'name' => 'permalink_hash' ] ) ) { $this->remove_index( $table_name, [ 'permalink_hash', ], [ 'name' => 'permalink_hash', ] ); } if ( ! $adapter->has_index( $table_name, [ 'permalink_hash', 'object_type' ], [ 'name' => 'permalink_hash_and_object_type' ] ) ) { $this->add_index( $table_name, [ 'permalink_hash', 'object_type', ], [ 'name' => 'permalink_hash_and_object_type', ] ); } } /** * Migration down. * * @return void */ public function down() { $table_name = $this->get_table_name(); $adapter = $this->get_adapter(); if ( ! $adapter->has_table( $table_name ) ) { return; } if ( $adapter->has_index( $table_name, [ 'permalink_hash', 'object_type' ], [ 'name' => 'permalink_hash_and_object_type' ] ) ) { $this->remove_index( $table_name, [ 'permalink_hash', 'object_type', ], [ 'name' => 'permalink_hash_and_object_type', ] ); } $this->change_column( $table_name, 'permalink_hash', 'string', [ 'null' => true, 'limit' => 191, ] ); if ( ! $adapter->has_index( $table_name, [ 'permalink_hash' ], [ 'name' => 'permalink_hash' ] ) ) { $this->add_index( $table_name, [ 'permalink_hash', ], [ 'name' => 'permalink_hash', ] ); } } /** * Retrieves the table name to use for storing indexables. * * @return string The table name to use. */ protected function get_table_name() { return Model::get_table_name( 'Indexable' ); } } PKP\0<migrations/20201216124002_ExpandIndexableIDColumnLengths.phpnuW+Achange_column( $this->get_table_name(), $column, 'biginteger', [ 'limit' => 20 ] ); } } /** * Migration down. * * @return void */ public function down() { } /** * Retrieves the table name to use for storing indexables. * * @return string The table name to use. */ protected function get_table_name() { return Model::get_table_name( 'Indexable' ); } } PKP\ `gg:migrations/20210817092415_AddVersionColumnToIndexables.phpnuW+Aadd_column( $this->get_table_name(), 'version', 'integer', [ 'default' => 1, ] ); } /** * Migration down. * * @return void */ public function down() { $this->remove_column( $this->get_table_name(), 'version' ); } /** * Retrieves the table name to use for storing indexables. * * @return string The table name to use. */ protected function get_table_name() { return Model::get_table_name( 'Indexable' ); } } PKP\&W! 1migrations/20200617122511_CreateSEOLinksTable.phpnuW+Aget_table_name(); $adapter = $this->get_adapter(); // The table may already have been created by legacy code. // If not, create it exactly as it was. if ( ! $adapter->table_exists( $table_name ) ) { $table = $this->create_table( $table_name, [ 'id' => false ] ); $table->column( 'id', 'biginteger', [ 'primary_key' => true, 'limit' => 20, 'unsigned' => true, 'auto_increment' => true, ] ); $table->column( 'url', 'string', [ 'limit' => 255 ] ); $table->column( 'post_id', 'biginteger', [ 'limit' => 20, 'unsigned' => true, ] ); $table->column( 'target_post_id', 'biginteger', [ 'limit' => 20, 'unsigned' => true, ] ); $table->column( 'type', 'string', [ 'limit' => 8 ] ); $table->finish(); } if ( ! $adapter->has_index( $table_name, [ 'post_id', 'type' ], [ 'name' => 'link_direction' ] ) ) { $this->add_index( $table_name, [ 'post_id', 'type' ], [ 'name' => 'link_direction' ] ); } // Add these columns outside of the initial table creation as these did not exist on the legacy table. $this->add_column( $table_name, 'indexable_id', 'integer', [ 'unsigned' => true ] ); $this->add_column( $table_name, 'target_indexable_id', 'integer', [ 'unsigned' => true ] ); $this->add_column( $table_name, 'height', 'integer', [ 'unsigned' => true ] ); $this->add_column( $table_name, 'width', 'integer', [ 'unsigned' => true ] ); $this->add_column( $table_name, 'size', 'integer', [ 'unsigned' => true ] ); $this->add_column( $table_name, 'language', 'string', [ 'limit' => 32 ] ); $this->add_column( $table_name, 'region', 'string', [ 'limit' => 32 ] ); $this->add_index( $table_name, [ 'indexable_id', 'type' ], [ 'name' => 'indexable_link_direction' ] ); } /** * Migration down. * * @return void */ public function down() { $this->drop_table( $this->get_table_name() ); } /** * Returns the SEO Links table name. * * @return string */ private function get_table_name() { return Model::get_table_name( 'SEO_Links' ); } } PKP\uKK7migrations/20200507054848_DeleteDuplicateIndexables.phpnuW+Aget_table_name(); /* * Deletes duplicate indexables that have the same object_id and object_type. * The rows with a higher ID are deleted as those should be unused and could be outdated. */ $this->query( 'DELETE wyi FROM ' . $table_name . ' wyi INNER JOIN ' . $table_name . ' wyi2 WHERE wyi2.object_id = wyi.object_id AND wyi2.object_type = wyi.object_type AND wyi2.id < wyi.id;' ); } /** * Migration down. * * @return void */ public function down() { // Nothing to do. } /** * Retrieves the table name to use. * * @return string The table name to use. */ protected function get_table_name() { return Model::get_table_name( 'Indexable' ); } } PKP\':migrations/20200513133401_ResetIndexableHierarchyTable.phpnuW+Aquery( 'TRUNCATE TABLE ' . $this->get_table_name() ); } /** * Migration down. * * @return void */ public function down() { // Nothing to do. } /** * Retrieves the table name to use. * * @return string The table name to use. */ protected function get_table_name() { return Model::get_table_name( 'Indexable_Hierarchy' ); } } PKP\.eTT4migrations/20200420073606_AddColumnsToIndexables.phpnuW+Aget_tables(); $blog_id = \get_current_blog_id(); foreach ( $tables as $table ) { $this->add_column( $table, 'blog_id', 'biginteger', [ 'null' => false, 'limit' => 20, 'default' => $blog_id, ] ); } $attr_limit_32 = [ 'null' => true, 'limit' => 32, ]; $attr_limit_64 = [ 'null' => true, 'limit' => 64, ]; $indexable_table = $this->get_indexable_table(); $this->add_column( $indexable_table, 'language', 'string', $attr_limit_32 ); $this->add_column( $indexable_table, 'region', 'string', $attr_limit_32 ); $this->add_column( $indexable_table, 'schema_page_type', 'string', $attr_limit_64 ); $this->add_column( $indexable_table, 'schema_article_type', 'string', $attr_limit_64 ); } /** * Migration down. * * @return void */ public function down() { $tables = $this->get_tables(); foreach ( $tables as $table ) { $this->remove_column( $table, 'blog_id' ); } $indexable_table = $this->get_indexable_table(); $this->remove_column( $indexable_table, 'language' ); $this->remove_column( $indexable_table, 'region' ); $this->remove_column( $indexable_table, 'schema_page_type' ); $this->remove_column( $indexable_table, 'schema_article_type' ); } /** * Retrieves the Indexable table. * * @return string The Indexable table name. */ protected function get_indexable_table() { return Model::get_table_name( 'Indexable' ); } /** * Retrieves the table names to use. * * @return string[] The table names to use. */ protected function get_tables() { return [ $this->get_indexable_table(), Model::get_table_name( 'Indexable_Hierarchy' ), Model::get_table_name( 'Primary_Term' ), ]; } } PKP\#V>migrations/20200428123747_BreadcrumbTitleAndHierarchyReset.phpnuW+Achange_column( $this->get_indexable_table_name(), 'breadcrumb_title', 'text', [ 'null' => true ] ); $this->query( 'DELETE FROM ' . $this->get_indexable_hierarchy_table_name() ); } /** * Migration down. * * @return void */ public function down() { $this->change_column( $this->get_indexable_table_name(), 'breadcrumb_title', 'string', [ 'null' => true, 'limit' => 191, ] ); } /** * Retrieves the table name to use for storing indexables. * * @return string The table name to use. */ protected function get_indexable_table_name() { return Model::get_table_name( 'Indexable' ); } /** * Retrieves the table name to use. * * @return string The table name to use. */ protected function get_indexable_hierarchy_table_name() { return Model::get_table_name( 'Indexable_Hierarchy' ); } } PKP\2migrations/20200430150130_ClearIndexableTables.phpnuW+Aquery( 'TRUNCATE TABLE ' . $this->get_indexable_table_name() ); $this->query( 'TRUNCATE TABLE ' . $this->get_indexable_hierarchy_table_name() ); } /** * Migration down. * * @return void */ public function down() { // Nothing to do. } /** * Retrieves the table name to use for storing indexables. * * @return string The table name to use. */ protected function get_indexable_table_name() { return Model::get_table_name( 'Indexable' ); } /** * Retrieves the table name to use. * * @return string The table name to use. */ protected function get_indexable_hierarchy_table_name() { return Model::get_table_name( 'Indexable_Hierarchy' ); } } PKP\':migrations/20200702141921_CreateIndexableSubpagesIndex.phpnuW+Achange_column( $this->get_table_name(), 'post_status', 'string', [ 'null' => true, 'limit' => 20, ] ); $this->add_index( $this->get_table_name(), [ 'post_parent', 'object_type', 'post_status', 'object_id' ], [ 'name' => 'subpages' ] ); } /** * Migration down. * * @return void */ public function down() { $this->change_column( $this->get_table_name(), 'post_status', 'string', [ 'null' => true, 'limit' => 191, ] ); $this->remove_index( $this->get_table_name(), [ 'post_parent', 'object_type', 'post_status', 'object_id' ], [ 'name' => 'subpages' ] ); } /** * Retrieves the table name to use for storing indexables. * * @return string The table name to use. */ protected function get_table_name() { return Model::get_table_name( 'Indexable' ); } } PKP\:N2migrations/20200408101900_AddCollationToTables.phpnuW+Aget_charset_collate(); if ( empty( $charset_collate ) ) { return; } $tables = [ Model::get_table_name( 'migrations' ), Model::get_table_name( 'Indexable' ), Model::get_table_name( 'Indexable_Hierarchy' ), Model::get_table_name( 'Primary_Term' ), ]; foreach ( $tables as $table ) { $this->query( 'ALTER TABLE ' . $table . ' CONVERT TO ' . \str_replace( 'DEFAULT ', '', $charset_collate ) ); } } /** * Migration down. * * @return void */ public function down() { // No down required. } } PKP\ ^[[>migrations/20200430075614_AddIndexableObjectIdAndTypeIndex.phpnuW+Aadd_index( $this->get_table_name(), [ 'object_id', 'object_type', ], [ 'name' => 'object_id_and_type', ] ); } /** * Migration down. * * @return void */ public function down() { $this->remove_index( $this->get_table_name(), [ 'object_id', 'object_type', ], [ 'name' => 'object_id_and_type', ] ); } /** * Retrieves the table name to use for storing indexables. * * @return string The table name to use. */ protected function get_table_name() { return Model::get_table_name( 'Indexable' ); } } PKP\)ƾ>migrations/20201216141134_ExpandPrimaryTermIDColumnLengths.phpnuW+Achange_column( $this->get_table_name(), $column, 'biginteger', [ 'limit' => 20 ] ); } } /** * Migration down. * * @return void */ public function down() { } /** * Retrieves the table name to use for storing indexables. * * @return string The table name to use. */ protected function get_table_name() { return Model::get_table_name( 'Primary_Term' ); } } PKP\_]5migrations/20201202144329_AddEstimatedReadingTime.phpnuW+Aget_table_name(); $this->add_column( $table_name, 'estimated_reading_time_minutes', 'integer', [ 'null' => true, 'default' => null, ] ); } /** * Migration down. * * @return void */ public function down() { $table_name = $this->get_table_name(); $this->remove_column( $table_name, 'estimated_reading_time_minutes' ); } /** * Retrieves the table name to use. * * @return string The table name to use. */ protected function get_table_name() { return Model::get_table_name( 'Indexable' ); } } PKP\B=wEmigrations/20200728095334_AddIndexesForProminentWordsOnIndexables.phpnuW+Aget_table_name(); $adapter = $this->get_adapter(); if ( ! $adapter->has_index( $table_name, $this->columns_with_index, [ 'name' => 'prominent_words' ] ) ) { $this->add_index( $table_name, $this->columns_with_index, [ 'name' => 'prominent_words', ] ); } } /** * Migration down. * * @return void */ public function down() { } /** * Retrieves the table name to use. * * @return string The table name to use. */ protected function get_table_name() { return Model::get_table_name( 'Indexable' ); } } PKP\؃  :migrations/20200428194858_ExpandIndexableColumnLengths.phpnuW+Achange_column( $this->get_table_name(), 'title', 'text', [ 'null' => true ] ); $this->change_column( $this->get_table_name(), 'open_graph_title', 'text', [ 'null' => true ] ); $this->change_column( $this->get_table_name(), 'twitter_title', 'text', [ 'null' => true ] ); $this->change_column( $this->get_table_name(), 'open_graph_image_source', 'text', [ 'null' => true ] ); $this->change_column( $this->get_table_name(), 'twitter_image_source', 'text', [ 'null' => true ] ); } /** * Migration down. * * @return void */ public function down() { $attr_limit_191 = [ 'null' => true, 'limit' => 191, ]; $this->change_column( $this->get_table_name(), 'title', 'string', $attr_limit_191 ); $this->change_column( $this->get_table_name(), 'opengraph_title', 'string', $attr_limit_191 ); $this->change_column( $this->get_table_name(), 'twitter_title', 'string', $attr_limit_191 ); $this->change_column( $this->get_table_name(), 'open_graph_image_source', 'string', $attr_limit_191 ); $this->change_column( $this->get_table_name(), 'twitter_image_source', 'string', $attr_limit_191 ); } /** * Retrieves the table name to use for storing indexables. * * @return string The table name to use. */ protected function get_table_name() { return Model::get_table_name( 'Indexable' ); } } PKP\qSSresearcher-languages.phpnuW+Abadge-group-names.phpnuW+A '16.7-beta0', ]; /** * The current plugin version. * * @var string */ protected $version; /** * Badge_Group_Names constructor. * * @param string|null $version Optional: the current plugin version. */ public function __construct( $version = null ) { if ( ! $version ) { $version = \WPSEO_VERSION; } $this->version = $version; } /** * Check whether a group of badges is still eligible for a "new" badge. * * @param string $group One of the GROUP_* constants. * @param string|null $current_version The current version of the plugin that's being checked. * * @return bool Whether a group of badges is still eligible for a "new" badge. */ public function is_still_eligible_for_new_badge( $group, $current_version = null ) { if ( ! \array_key_exists( $group, $this::GROUP_NAMES ) ) { return false; } $group_version = $this::GROUP_NAMES[ $group ]; if ( $current_version === null ) { $current_version = $this->version; } return (bool) \version_compare( $group_version, $current_version, '>' ); } } PKP\= -migration-status.phpnuW+Aget_migration_status( $name ); // Check if we've attempted to run this migration in the past 10 minutes. If so, it may still be running. if ( \array_key_exists( 'lock', $migration_status ) ) { $timestamp = \strtotime( '-10 minutes' ); return $timestamp > $migration_status['lock']; } // Is the migration version less than the current version. return \version_compare( $migration_status['version'], $version, '<' ); } /** * Checks whether or not the given migration is at least the given version, defaults to checking for the latest version. * * @param string $name The name of the migration. * @param string $version The version to check, defaults to the latest version. * * @return bool Whether or not the requested migration is at least the requested version. */ public function is_version( $name, $version = \WPSEO_VERSION ) { $migration_status = $this->get_migration_status( $name ); return \version_compare( $version, $migration_status['version'], '<=' ); } /** * Gets the error of a given migration if it exists. * * @param string $name The name of the migration. * * @return bool|array False if there is no error, otherwise the error. */ public function get_error( $name ) { $migration_status = $this->get_migration_status( $name ); if ( ! isset( $migration_status['error'] ) ) { return false; } return $migration_status['error']; } /** * Sets an error for the migration. * * @param string $name The name of the migration. * @param string $message Message explaining the reason for the error. * @param string $version The current version. * * @return void */ public function set_error( $name, $message, $version = \WPSEO_VERSION ) { $migration_status = $this->get_migration_status( $name ); $migration_status['error'] = [ 'time' => \strtotime( 'now' ), 'version' => $version, 'message' => $message, ]; $this->set_migration_status( $name, $migration_status ); } /** * Updates the migration version to the latest version. * * @param string $name The name of the migration. * @param string $version The current version. * * @return void */ public function set_success( $name, $version = \WPSEO_VERSION ) { $migration_status = $this->get_migration_status( $name ); unset( $migration_status['lock'] ); unset( $migration_status['error'] ); $migration_status['version'] = $version; $this->set_migration_status( $name, $migration_status ); } /** * Locks the migration status. * * @param string $name The name of the migration. * * @return bool Whether or not the migration was succesfully locked. */ public function lock_migration( $name ) { $migration_status = $this->get_migration_status( $name ); $migration_status['lock'] = \strtotime( 'now' ); return $this->set_migration_status( $name, $migration_status ); } /** * Retrieves the migration option. * * @param string $name The name of the migration. * * @return bool|array The status of the migration, false if no status exists. */ protected function get_migration_status( $name ) { $current_blog_id = \get_current_blog_id(); if ( ! isset( $this->migration_options[ $current_blog_id ][ $name ] ) ) { $migration_status = \get_option( self::MIGRATION_OPTION_KEY . $name ); if ( ! \is_array( $migration_status ) || ! isset( $migration_status['version'] ) ) { $migration_status = [ 'version' => '0.0' ]; } if ( ! isset( $this->migration_options[ $current_blog_id ] ) ) { $this->migration_options[ $current_blog_id ] = []; } $this->migration_options[ $current_blog_id ][ $name ] = $migration_status; } return $this->migration_options[ $current_blog_id ][ $name ]; } /** * Retrieves the migration option. * * @param string $name The name of the migration. * @param array $migration_status The migration status. * * @return bool True if the status was succesfully updated, false otherwise. */ protected function set_migration_status( $name, $migration_status ) { if ( ! \is_array( $migration_status ) || ! isset( $migration_status['version'] ) ) { return false; } $current_blog_id = \get_current_blog_id(); if ( ! isset( $this->migration_options[ $current_blog_id ] ) ) { $this->migration_options[ $current_blog_id ] = []; } $this->migration_options[ $current_blog_id ][ $name ] = $migration_status; return \update_option( self::MIGRATION_OPTION_KEY . $name, $migration_status ); } } PKP\rKDlCCschema-ids.phpnuW+APKP\=q`##conflicting-plugins.phpnuW+APKP\wincher-pkce-provider.phpnuW+APKP\MSSI6wincher-client.phpnuW+APKP\&y##Eoauth-client.phpnuW+APKP\y$_Tischema-types.phpnuW+APKP\MБu u ysemrush-client.phpnuW+APKP\##indexing-reasons.phpnuW+APKP\e{{C migrations/20190529075038_WpYoastDropIndexableMetaTableIfExists.phpnuW+APKP\.migrations/20171228151840_WpYoastIndexable.phpnuW+APKP\{: 1migrations/20211020091404_AddObjectTimestamps.phpnuW+APKP\^=3omigrations/20200609154515_AddHasAncestorsColumn.phpnuW+APKP\ut::7migrations/20191011111109_WpYoastIndexableHierarchy.phpnuW+APKP\vi7$migrations/20230417083836_AddInclusiveLanguageScore.phpnuW+APKP\5z0=migrations/20171228151841_WpYoastPrimaryTerm.phpnuW+APKP\y7migrations/20200616130143_ReplacePermalinkHashIndex.phpnuW+APKP\0< migrations/20201216124002_ExpandIndexableIDColumnLengths.phpnuW+APKP\ `gg:migrations/20210817092415_AddVersionColumnToIndexables.phpnuW+APKP\&W! 1[migrations/20200617122511_CreateSEOLinksTable.phpnuW+APKP\uKK7migrations/20200507054848_DeleteDuplicateIndexables.phpnuW+APKP\':Kmigrations/20200513133401_ResetIndexableHierarchyTable.phpnuW+APKP\.eTT4migrations/20200420073606_AddColumnsToIndexables.phpnuW+APKP\#V>cmigrations/20200428123747_BreadcrumbTitleAndHierarchyReset.phpnuW+APKP\2amigrations/20200430150130_ClearIndexableTables.phpnuW+APKP\':migrations/20200702141921_CreateIndexableSubpagesIndex.phpnuW+APKP\:N2migrations/20200408101900_AddCollationToTables.phpnuW+APKP\ ^[[>3migrations/20200430075614_AddIndexableObjectIdAndTypeIndex.phpnuW+APKP\)ƾ> migrations/20201216141134_ExpandPrimaryTermIDColumnLengths.phpnuW+APKP\_]5omigrations/20201202144329_AddEstimatedReadingTime.phpnuW+APKP\B=wEmigrations/20200728095334_AddIndexesForProminentWordsOnIndexables.phpnuW+APKP\؃  :migrations/20200428194858_ExpandIndexableColumnLengths.phpnuW+APKP\qSS6#researcher-languages.phpnuW+APKP\>$badge-group-names.phpnuW+APKP\= - +migration-status.phpnuW+APK""Y?