Automattic\WooCommerce\Internal\PushNotifications\DataStores

PushTokensDataStore::get_tokens_for_rolespublicWC 10.7.0

Returns push tokens belonging to users with the given roles.

When called without pagination parameters, returns all tokens as a flat array (cached per-request). When $page and $per_page are provided, returns a paginated result with total counts.

Method of the class: PushTokensDataStore{}

No Hooks.

Returns

PushToken[]|Array{tokens:. PushToken[], total: int, total_pages: int}

Usage

$PushTokensDataStore = new PushTokensDataStore();
$PushTokensDataStore->get_tokens_for_roles( $roles, ?int $page, ?int $per_page );
$roles(string[]) (required)
The roles to query tokens for.
?int $page
.
Default: null
?int $per_page
.
Default: null

Changelog

Since 10.7.0 Introduced.

PushTokensDataStore::get_tokens_for_roles() code WC 10.8.1

public function get_tokens_for_roles( array $roles, ?int $page = null, ?int $per_page = null ) {
	$paginate  = null !== $page && null !== $per_page;
	$cache_key = $paginate ? implode( ',', $roles ) . ":$page:$per_page" : implode( ',', $roles );

	$empty_result = $paginate
		? array(
			'tokens'      => array(),
			'total'       => 0,
			'total_pages' => 0,
		)
		: array();

	if ( empty( $roles ) ) {
		return $empty_result;
	}

	if ( isset( $this->tokens_by_roles_cache[ $cache_key ] ) ) {
		return $this->tokens_by_roles_cache[ $cache_key ];
	}

	$user_ids = get_users(
		array(
			'role__in' => $roles,
			'fields'   => 'ID',
		)
	);

	if ( empty( $user_ids ) ) {
		$this->tokens_by_roles_cache[ $cache_key ] = $empty_result;
		return $this->tokens_by_roles_cache[ $cache_key ];
	}

	$query_args = array(
		'post_type'      => PushToken::POST_TYPE,
		'post_status'    => 'private',
		'author__in'     => $user_ids,
		'posts_per_page' => $paginate ? $per_page : -1,
		'fields'         => 'ids',
	);

	if ( $paginate ) {
		$query_args['paged']   = $page;
		$query_args['orderby'] = 'ID';
		$query_args['order']   = 'ASC';
	}

	$query = new WP_Query( $query_args );

	/**
	 * Typehint for PHPStan, specifies these are IDs and not instances of
	 * WP_Post.
	 *
	 * @var int[] $post_ids
	 */
	$post_ids = $query->posts;

	if ( empty( $post_ids ) ) {
		$this->tokens_by_roles_cache[ $cache_key ] = $empty_result;
		return $this->tokens_by_roles_cache[ $cache_key ];
	}

	update_meta_cache( 'post', $post_ids );

	$tokens = array();

	foreach ( $post_ids as $post_id ) {
		try {
			$tokens[] = $this->read( (int) $post_id );
		} catch ( WC_Data_Exception $e ) {
			wc_get_logger()->warning(
				'Skipping malformed push token during role-based query.',
				array(
					'token_id' => $post_id,
					'error'    => $e->getMessage(),
				)
			);
		}
	}

	$result = $paginate
		? array(
			'tokens'      => $tokens,
			'total'       => (int) $query->found_posts,
			'total_pages' => (int) $query->max_num_pages,
		)
		: $tokens;

	$this->tokens_by_roles_cache[ $cache_key ] = $result;
	return $result;
}