���� 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*!PKU\0WV''index-command.phpnuW+Apost_indexation_action = $post_indexation_action; $this->term_indexation_action = $term_indexation_action; $this->post_type_archive_indexation_action = $post_type_archive_indexation_action; $this->general_indexation_action = $general_indexation_action; $this->complete_indexation_action = $complete_indexation_action; $this->prepare_indexing_action = $prepare_indexing_action; $this->post_link_indexing_action = $post_link_indexing_action; $this->term_link_indexing_action = $term_link_indexing_action; $this->indexable_helper = $indexable_helper; } /** * Gets the namespace. * * @return string */ public static function get_namespace() { return Main::WP_CLI_NAMESPACE; } /** * Indexes all your content to ensure the best performance. * * ## OPTIONS * * [--network] * : Performs the indexation on all sites within the network. * * [--reindex] * : Removes all existing indexables and then reindexes them. * * [--skip-confirmation] * : Skips the confirmations (for automated systems). * * [--interval=] * : The number of microseconds (millionths of a second) to wait between index actions. * --- * default: 500000 * --- * * ## EXAMPLES * * wp yoast index * * @when after_wp_load * * @param array|null $args The arguments. * @param array|null $assoc_args The associative arguments. * * @return void */ public function index( $args = null, $assoc_args = null ) { if ( ! $this->indexable_helper->should_index_indexables() ) { WP_CLI::log( \__( 'Your WordPress environment is running on a non-production site. Indexables can only be created on production environments. Please check your `WP_ENVIRONMENT_TYPE` settings.', 'wordpress-seo' ) ); return; } if ( ! isset( $assoc_args['network'] ) ) { $this->run_indexation_actions( $assoc_args ); return; } $criteria = [ 'fields' => 'ids', 'spam' => 0, 'deleted' => 0, 'archived' => 0, ]; $blog_ids = \get_sites( $criteria ); foreach ( $blog_ids as $blog_id ) { \switch_to_blog( $blog_id ); \do_action( '_yoast_run_migrations' ); $this->run_indexation_actions( $assoc_args ); \restore_current_blog(); } } /** * Runs all indexation actions. * * @param array $assoc_args The associative arguments. * * @return void */ protected function run_indexation_actions( $assoc_args ) { // See if we need to clear all indexables before repopulating. if ( isset( $assoc_args['reindex'] ) ) { // Argument --skip-confirmation to prevent confirmation (for automated systems). if ( ! isset( $assoc_args['skip-confirmation'] ) ) { WP_CLI::confirm( 'This will clear all previously indexed objects. Are you certain you wish to proceed?' ); } // Truncate the tables. $this->clear(); // Delete the transients to make sure re-indexing runs every time. \delete_transient( Indexable_Post_Indexation_Action::UNINDEXED_COUNT_TRANSIENT ); \delete_transient( Indexable_Post_Type_Archive_Indexation_Action::UNINDEXED_COUNT_TRANSIENT ); \delete_transient( Indexable_Term_Indexation_Action::UNINDEXED_COUNT_TRANSIENT ); } $indexation_actions = [ 'posts' => $this->post_indexation_action, 'terms' => $this->term_indexation_action, 'post type archives' => $this->post_type_archive_indexation_action, 'general objects' => $this->general_indexation_action, 'post links' => $this->post_link_indexing_action, 'term links' => $this->term_link_indexing_action, ]; $this->prepare_indexing_action->prepare(); $interval = (int) $assoc_args['interval']; foreach ( $indexation_actions as $name => $indexation_action ) { $this->run_indexation_action( $name, $indexation_action, $interval ); } $this->complete_indexation_action->complete(); } /** * Runs an indexation action. * * @param string $name The name of the object to be indexed. * @param Indexation_Action_Interface $indexation_action The indexation action. * @param int $interval Number of microseconds (millionths of a second) to wait between index actions. * * @return void */ protected function run_indexation_action( $name, Indexation_Action_Interface $indexation_action, $interval ) { $total = $indexation_action->get_total_unindexed(); if ( $total > 0 ) { $limit = $indexation_action->get_limit(); $progress = Utils\make_progress_bar( 'Indexing ' . $name, $total ); do { $indexables = $indexation_action->index(); $count = \count( $indexables ); $progress->tick( $count ); \usleep( $interval ); Utils\wp_clear_object_cache(); } while ( $count >= $limit ); $progress->finish(); } } /** * Clears the database related to the indexables. * * @return void */ protected function clear() { global $wpdb; // For the PreparedSQLPlaceholders issue, see: https://github.com/WordPress/WordPress-Coding-Standards/issues/1903. // For the DirectDBQuery issue, see: https://github.com/WordPress/WordPress-Coding-Standards/issues/1947. // phpcs:disable WordPress.DB -- Table names should not be quoted and truncate queries can not be cached. $wpdb->query( $wpdb->prepare( 'TRUNCATE TABLE %1$s', Model::get_table_name( 'Indexable' ) ) ); $wpdb->query( $wpdb->prepare( 'TRUNCATE TABLE %1$s', Model::get_table_name( 'Indexable_Hierarchy' ) ) ); // phpcs:enable } } PKU\cleanup_integration = $cleanup_integration; } /** * Returns the namespace of this command. * * @return string */ public static function get_namespace() { return Main::WP_CLI_NAMESPACE; } /** * Performs a cleanup of custom Yoast tables. * * This removes unused, unwanted or orphaned database records, which ensures the best performance. Including: * - Indexables * - Indexable hierarchy * - SEO links * * ## OPTIONS * * [--batch-size=] * : The number of database records to clean up in a single sql query. * --- * default: 1000 * --- * * [--interval=] * : The number of microseconds (millionths of a second) to wait between cleanup batches. * --- * default: 500000 * --- * * [--network] * : Performs the cleanup on all sites within the network. * * ## EXAMPLES * * wp yoast cleanup * * @when after_wp_load * * @param array|null $args The arguments. * @param array|null $assoc_args The associative arguments. * * @return void * * @throws ExitException When the input args are invalid. */ public function cleanup( $args = null, $assoc_args = null ) { if ( isset( $assoc_args['interval'] ) && (int) $assoc_args['interval'] < 0 ) { WP_CLI::error( \__( 'The value for \'interval\' must be a positive integer.', 'wordpress-seo' ) ); } if ( isset( $assoc_args['batch-size'] ) && (int) $assoc_args['batch-size'] < 1 ) { WP_CLI::error( \__( 'The value for \'batch-size\' must be a positive integer higher than equal to 1.', 'wordpress-seo' ) ); } if ( isset( $assoc_args['network'] ) && \is_multisite() ) { $total_removed = $this->cleanup_network( $assoc_args ); } else { $total_removed = $this->cleanup_current_site( $assoc_args ); } WP_CLI::success( \sprintf( /* translators: %1$d is the number of records that are removed. */ \_n( 'Cleaned up %1$d record.', 'Cleaned up %1$d records.', $total_removed, 'wordpress-seo' ), $total_removed ) ); } /** * Performs the cleanup for the entire network. * * @param array|null $assoc_args The associative arguments. * * @return int The number of cleaned up records. */ private function cleanup_network( $assoc_args ) { $criteria = [ 'fields' => 'ids', 'spam' => 0, 'deleted' => 0, 'archived' => 0, ]; $blog_ids = \get_sites( $criteria ); $total_removed = 0; foreach ( $blog_ids as $blog_id ) { \switch_to_blog( $blog_id ); $total_removed += $this->cleanup_current_site( $assoc_args ); \restore_current_blog(); } return $total_removed; } /** * Performs the cleanup for a single site. * * @param array|null $assoc_args The associative arguments. * * @return int The number of cleaned up records. */ private function cleanup_current_site( $assoc_args ) { $site_url = \site_url(); $total_removed = 0; if ( ! \is_plugin_active( \WPSEO_BASENAME ) ) { /* translators: %1$s is the site url of the site that is skipped. %2$s is Yoast SEO. */ WP_CLI::warning( \sprintf( \__( 'Skipping %1$s. %2$s is not active on this site.', 'wordpress-seo' ), $site_url, 'Yoast SEO' ) ); return $total_removed; } // Make sure the DB is up to date first. \do_action( '_yoast_run_migrations' ); $tasks = $this->cleanup_integration->get_cleanup_tasks(); $limit = (int) $assoc_args['batch-size']; $interval = (int) $assoc_args['interval']; /* translators: %1$s is the site url of the site that is cleaned up. %2$s is the name of the cleanup task that is currently running. */ $progress_bar_title_format = \__( 'Cleaning up %1$s [%2$s]', 'wordpress-seo' ); $progress = Utils\make_progress_bar( \sprintf( $progress_bar_title_format, $site_url, \key( $tasks ) ), \count( $tasks ) ); foreach ( $tasks as $task_name => $task ) { // Update the progressbar title with the current task name. $progress->tick( 0, \sprintf( $progress_bar_title_format, $site_url, $task_name ) ); do { $items_cleaned = $task( $limit ); if ( \is_int( $items_cleaned ) ) { $total_removed += $items_cleaned; } \usleep( $interval ); // Update the timer. $progress->tick( 0 ); } while ( $items_cleaned !== false && $items_cleaned > 0 ); $progress->tick(); } $progress->finish(); $this->cleanup_integration->reset_cleanup(); WP_CLI::log( \sprintf( /* translators: %1$d is the number of records that were removed. %2$s is the site url. */ \_n( 'Cleaned up %1$d record from %2$s.', 'Cleaned up %1$d records from %2$s.', $total_removed, 'wordpress-seo' ), $total_removed, $site_url ) ); return $total_removed; } } PKU\ 44command-interface.phpnuW+Acommand-interface.phpnuW+APK@