get_unindexed_post_ids( $this->get_post_types(), ( $limit + 1 ) ); return count( $unindexed_post_ids ) > $limit; } /** * Returns the total unindexed posts for given post type. * * @since 4.6.0 * * @param string $post_type The posttype to fetch. * * @return int The total amount of unindexed posts. */ public function get_total( $post_type ) { if ( ! array_key_exists( $post_type, $this->totals ) ) { $totals = $this->get_totals( $this->get_post_types() ); foreach ( $totals as $total_post_type => $total ) { $this->totals[ $total_post_type ] = $total; } } if ( ! array_key_exists( $post_type, $this->totals ) ) { $this->totals[ $post_type ] = 0; } return $this->totals[ $post_type ]; } /** * Returns the totals for each posttype by counting them. * * @since 4.6.0 * * @param array $post_types The posttype to limit the resultset for. * * @return array Array with the totals for the requested posttypes. */ public function get_totals( $post_types ) { global $wpdb; if ( $post_types === [] ) { return $post_types; } $replacements = [ WPSEO_Premium_Prominent_Words_Versioning::POST_META_NAME, WPSEO_Premium_Prominent_Words_Versioning::get_version_number(), ]; $replacements = array_merge( $replacements, $post_types ); $results = $wpdb->get_results( $wpdb->prepare( ' SELECT COUNT( ID ) as total, post_type FROM ' . $wpdb->posts . ' WHERE ID NOT IN( SELECT post_id FROM ' . $wpdb->postmeta . ' WHERE meta_key = %s AND meta_value = %s ) AND post_status IN( "future", "draft", "pending", "private", "publish" ) AND post_type IN( ' . implode( ',', array_fill( 0, count( $post_types ), '%s' ) ) . ' ) GROUP BY post_type ', $replacements ) ); $totals = []; foreach ( $results as $result ) { $totals[ $this->determine_rest_endpoint_for_post_type( $result->post_type ) ] = (int) $result->total; } return $totals; } /** * Determines the REST endpoint for the given post type. * * @param string $post_type The post type to determine the endpoint for. * * @return string The endpoint. Returns empty string if post type doesn't exist. */ protected function determine_rest_endpoint_for_post_type( $post_type ) { $post_type_object = get_post_type_object( $post_type ); if ( is_null( $post_type_object ) ) { return ''; } if ( isset( $post_type_object->rest_base ) && ! empty( $post_type_object->rest_base ) ) { return $post_type_object->rest_base; } return $post_type_object->name; } /** * Returns the array with supported posttypes. * * @return array The supported posttypes. */ protected function get_post_types() { $prominent_words_support = new WPSEO_Premium_Prominent_Words_Support(); return array_filter( $prominent_words_support->get_supported_post_types(), [ 'WPSEO_Post_Type', 'is_rest_enabled' ] ); } /** * Gets the Post IDs of un-indexed objects. * * @param array|string $post_types The post type(s) to fetch. * @param int $limit Limit the number of results. * * @return int[] Post IDs found which are un-indexed. */ public function get_unindexed_post_ids( $post_types, $limit ) { global $wpdb; if ( is_string( $post_types ) ) { $post_types = (array) $post_types; } if ( $post_types === [] ) { return $post_types; } $replacements = [ WPSEO_Premium_Prominent_Words_Versioning::POST_META_NAME, WPSEO_Premium_Prominent_Words_Versioning::get_version_number(), ]; $replacements = array_merge( $replacements, $post_types ); $replacements[] = $limit; $results = $wpdb->get_results( $wpdb->prepare( ' SELECT ID FROM ' . $wpdb->posts . ' WHERE ID NOT IN( SELECT post_id FROM ' . $wpdb->postmeta . ' WHERE meta_key = %s AND meta_value = %s ) AND post_status IN( "future", "draft", "pending", "private", "publish" ) AND post_type IN( ' . implode( ',', array_fill( 0, count( $post_types ), '%s' ) ) . ' ) LIMIT %d', $replacements ), ARRAY_A ); // Make sure we return a list of IDs. $results = wp_list_pluck( $results, 'ID' ); return $results; } /** * Returns the array with supported post statuses. * * @return string[] The supported post statuses. */ public function get_supported_post_statuses() { return [ 'future', 'draft', 'pending', 'private', 'publish' ]; } }