# themes_api()

URL: https://chugunov.pro/api-wordpress/functions/themes_api/
Проверено на WordPress 6.9, обновлено 06.08.2026.
Источник: независимый русскоязычный справочник chugunov.pro. Не является официальной документацией WordPress.

Тип: функция.
Появился в версии: 2.8.0.

## Сигнатура

```php
themes_api( string $action, array|object $args = array() ): object|array|WP_Error
```

## Описание

Тема может переопределить результат API тем с помощью трёх фильтров. Предполагается, что это предназначено для тем, которые могут расширять сведения о теме, предлагая больше вариантов. Это очень мощный механизм, и переопределять фильтры следует с осторожностью.
Первый фильтр, ‘themes_api_args’, отвечает за аргументы и передаёт действие вторым параметром. Хук ‘themes_api_args’ обязан обеспечить возврат объекта.
Второй фильтр, ‘themes_api’, позволяет плагину полностью переопределить API тем WordPress.org. Если $action равно ‘query_themes’, ‘theme_information’ или ‘feature_list’, ДОЛЖЕН быть передан объект. Если $action равно ‘hot_tags’, следует передать массив.
Наконец, третий фильтр, ‘themes_api_result’, даёт возможность отфильтровать объект или массив ответа в зависимости от типа $action.
Поддерживаемые аргументы по каждому действию:

Имя аргумента
‘query_themes’
‘theme_information’
‘hot_tags’
‘feature_list’

$slug
Нет
Да
Нет
Нет

$per_page
Да
Нет
Нет
Нет

$page
Да
Нет
Нет
Нет

$number
Нет
Нет
Да
Нет

$search
Да
Нет
Нет
Нет

$tag
Да
Нет
Нет
Нет

$author
Да
Нет
Нет
Нет

$user
Да
Нет
Нет
Нет

$browse
Да
Нет
Нет
Нет

$locale
Да
Да
Нет
Нет

$fields
Да
Да
Нет
Нет

## Параметры

- `$action` `string` — обязательный. Действие API, которое нужно выполнить. Принимает 'query_themes', 'theme_information', 'hot_tags' или 'feature_list'.
- `$args` `array|object` — необязательный, по умолчанию `array()`. Array or object of arguments to serialize for the Themes API.
  
  - `slug` string The theme slug.
  
  - `per_page` int Number of themes per page. Default 24.
  
  - `page` int Number of current page. Default 1.
  
  - `number` int Number of tags to be queried.
  
  - `search` string A search term.
  
  - `tag` string Tag to filter themes.
  
  - `author` string Username of an author to filter themes.
  
  - `user` string Username to query for their favorites.
  
  - `browse` string Browse view: `'featured'`, `'popular'`, `'updated'`, `'favorites'`.
  
  - `locale` string Locale to provide context-sensitive results. Default is the value of [get_locale()](https://developer.wordpress.org/reference/functions/get_locale/) .
  
  - `fields` array Array of fields which should or should not be returned.
  
  - `description` bool Whether to return the theme full description. Default false.
  
  - `sections` bool Whether to return the theme readme sections: description, installation, FAQ, screenshots, other notes, and changelog. Default false.
  
  - `rating` bool Whether to return the rating in percent and total number of ratings.
  
  Default false.
  
  - `ratings` bool Whether to return the number of rating for each star (1-5). Default false.
  
  - `downloaded` bool Whether to return the download count. Default false.
  
  - `downloadlink` bool Whether to return the download link for the package. Default false.
  
  - `last_updated` bool Whether to return the date of the last update. Default false.
  
  - `tags` bool Whether to return the assigned tags. Default false.
  
  - `homepage` bool Whether to return the theme homepage link. Default false.
  
  - `screenshots` bool Whether to return the screenshots. Default false.
  
  - `screenshot_count` int Number of screenshots to return. Default 1.
  
  - `screenshot_url` bool Whether to return the URL of the first screenshot. Default false.
  
  - `photon_screenshots` bool Whether to return the screenshots via Photon. Default false.
  
  - `template` bool Whether to return the slug of the parent theme. Default false.
  
  - `parent` bool Whether to return the slug, name and homepage of the parent theme. Default false.
  
  - `versions` bool Whether to return the list of all available versions. Default false.
  
  - `theme_url` bool Whether to return theme’s URL. Default false.
  
  - `extended_author` bool Whether to return nicename or nicename and display name. Default false.
  
  Default:`array()`
  [Return](#return) object|array|[WP_Error](https://developer.wordpress.org/reference/classes/wp_error/) Response object or array on success, [WP_Error](https://developer.wordpress.org/reference/classes/wp_error/) on failure. See the [ function reference article](https://developer.wordpress.org/reference/functions/themes_api/) for more information on the make-up of possible return objects depending on the value of `$action`.
  
  [Source](#source)
  
  ```
  function themes_api( $action, $args = array() ) {
  if ( is_array( $args ) ) {
  $args = (object) $args;
  }
  
  if ( 'query_themes' === $action ) {
  if ( ! isset( $args->per_page ) ) {
  $args->per_page = 24;
  }
  }
  
  if ( ! isset( $args->locale ) ) {
  $args->locale = get_user_locale();
  }
  
  if ( ! isset( $args->wp_version ) ) {
  $args->wp_version = substr( wp_get_wp_version(), 0, 3 ); // x.y
  }
  
  /**
  * Filters arguments used to query for installer pages from the WordPress.org Themes API.
  *
  * Important: An object MUST be returned to this filter.
  *
  * @since 2.8.0
  *
  * @param object $args Arguments used to query for installer pages from the WordPress.org Themes API.
  * @param string $action Requested action. Likely values are 'theme_information',
  * 'feature_list', or 'query_themes'.
  */
  $args = apply_filters( 'themes_api_args', $args, $action );
  
  /**
  * Filters whether to override the WordPress.org Themes API.
  *
  * Returning a non-false value will effectively short-circuit the WordPress.org API request.
  *
  * If `$action` is 'query_themes', 'theme_information', or 'feature_list', an object MUST
  * be passed. If `$action` is 'hot_tags', an array should be passed.
  *
  * @since 2.8.0
  *
  * @param false|object|array $override Whether to override the WordPress.org Themes API. Default false.
  * @param string $action Requested action. Likely values are 'theme_information',
  * 'feature_list', or 'query_themes'.
  * @param object $args Arguments used to query for installer pages from the Themes API.
  */
  $res = apply_filters( 'themes_api', false, $action, $args );
  
  if ( ! $res ) {
  $url = 'https://api.wordpress.org/themes/info/1.2/';
  $url = add_query_arg(
  array(
  'action' => $action,
  'request' => $args,
  ),
  $url
  );
  
  $http_url = $url;
  $ssl = wp_http_supports( array( 'ssl' ) );
  if ( $ssl ) {
  $url = set_url_scheme( $url, 'https' );
  }
  
  $http_args = array(
  'timeout' => 15,
  'user-agent' => 'WordPress/' . wp_get_wp_version() . '; ' . home_url( '/' ),
  );
  $request = wp_remote_get( $url, $http_args );
  
  if ( $ssl && is_wp_error( $request ) ) {
  if ( ! wp_doing_ajax() ) {
  wp_trigger_error(
  __FUNCTION__,
  sprintf(
  /* translators: %s: Support forums URL. */
  __( 'An unexpected error occurred. Something may be wrong with WordPress.org or this server’s configuration. If you continue to have problems, please try the [support forums](%s).' ),
  __( 'https://wordpress.org/support/forums/' )
  ) . ' ' . __( '(WordPress could not establish a secure connection to WordPress.org. Please contact your server administrator.)' ),
  headers_sent() || WP_DEBUG ? E_USER_WARNING : E_USER_NOTICE
  );
  }
  $request = wp_remote_get( $http_url, $http_args );
  }
  
  if ( is_wp_error( $request ) ) {
  $res = new WP_Error(
  'themes_api_failed',
  sprintf(
  /* translators: %s: Support forums URL. */
  __( 'An unexpected error occurred. Something may be wrong with WordPress.org or this server’s configuration. If you continue to have problems, please try the [support forums](%s).' ),
  __( 'https://wordpress.org/support/forums/' )
  ),
  $request->get_error_message()
  );
  } else {
  $res = json_decode( wp_remote_retrieve_body( $request ), true );
  if ( is_array( $res ) ) {
  // Object casting is required in order to match the info/1.0 format.
  $res = (object) $res;
  } elseif ( null === $res ) {
  $res = new WP_Error(
  'themes_api_failed',
  sprintf(
  /* translators: %s: Support forums URL. */
  __( 'An unexpected error occurred. Something may be wrong with WordPress.org or this server’s configuration. If you continue to have problems, please try the [support forums](%s).' ),
  __( 'https://wordpress.org/support/forums/' )
  ),
  wp_remote_retrieve_body( $request )
  );
  }
  
  if ( isset( $res->error ) ) {
  $res = new WP_Error( 'themes_api_failed', $res->error );
  }
  }
  
  if ( ! is_wp_error( $res ) ) {
  // Back-compat for info/1.2 API, upgrade the theme objects in query_themes to objects.
  if ( 'query_themes' === $action ) {
  foreach ( $res->themes as $i => $theme ) {
  $res->themes[ $i ] = (object) $theme;
  }
  }
  
  // Back-compat for info/1.2 API, downgrade the feature_list result back to an array.
  if ( 'feature_list' === $action ) {
  $res = (array) $res;
  }
  }
  }
  
  /**
  * Filters the returned WordPress.org Themes API response.
  *
  * @since 2.8.0
  *
  * @param array|stdClass|WP_Error $res WordPress.org Themes API response.
  * @param string $action Requested action. Likely values are 'theme_information',
  * 'feature_list', or 'query_themes'.
  * @param stdClass $args Arguments used to query for installer pages from the WordPress.org Themes API.
  */
  return apply_filters( 'themes_api_result', $res, $action, $args );
  }
  ```
  
  [View all references](https://developer.wordpress.org/reference/files/wp-admin/includes/theme.php/) [View on Trac](https://core.trac.wordpress.org/browser/tags/7.0/src/wp-admin/includes/theme.php#L491) [View on GitHub](https://github.com/WordPress/wordpress-develop/blob/7.0/src/wp-admin/includes/theme.php#L491-L635)
  [Hooks](#hooks) [apply_filters ( ‘themes_api’, false|object|array $override , string $action , object $args  )](https://developer.wordpress.org/reference/hooks/themes_api/)Filters whether to override the WordPress.org Themes API.
  [apply_filters ( ‘themes_api_args’, object $args , string $action  )](https://developer.wordpress.org/reference/hooks/themes_api_args/)Filters arguments used to query for installer pages from the WordPress.org Themes API.
  [apply_filters ( ‘themes_api_result’, array|stdClass|WP_Error $res , string $action , stdClass $args  )](https://developer.wordpress.org/reference/hooks/themes_api_result/)Filters the returned WordPress.org Themes API response.
  
  [Related](#related) Uses | Description |
  [wp_get_wp_version()](https://developer.wordpress.org/reference/functions/wp_get_wp_version/)`wp-includes/functions.php` | Returns the current WordPress version.
  |
  [wp_trigger_error()](https://developer.wordpress.org/reference/functions/wp_trigger_error/)`wp-includes/functions.php` | Generates a user-level error/warning/notice/deprecation message.
  |
  [wp_doing_ajax()](https://developer.wordpress.org/reference/functions/wp_doing_ajax/)`wp-includes/load.php` | Determines whether the current request is a WordPress Ajax request.
  |
  [get_user_locale()](https://developer.wordpress.org/reference/functions/get_user_locale/)`wp-includes/l10n.php` | Retrieves the locale of a user.
  |
  [set_url_scheme()](https://developer.wordpress.org/reference/functions/set_url_scheme/)`wp-includes/link-template.php` | Sets the scheme for a URL.
  |
  [wp_http_supports()](https://developer.wordpress.org/reference/functions/wp_http_supports/)`wp-includes/http.php` | Determines if there is an HTTP Transport that can process this request.
  |
  [wp_remote_get()](https://developer.wordpress.org/reference/functions/wp_remote_get/)`wp-includes/http.php` | Performs an HTTP request using the GET method and returns its response.
  |
  [wp_remote_retrieve_body()](https://developer.wordpress.org/reference/functions/wp_remote_retrieve_body/)`wp-includes/http.php` | Retrieves only the body from the raw response.
  |
  [__()](https://developer.wordpress.org/reference/functions/__/)`wp-includes/l10n.php` | Retrieves the translation of $text.
  |
  [add_query_arg()](https://developer.wordpress.org/reference/functions/add_query_arg/)`wp-includes/functions.php` | Retrieves a modified URL query string.
  |
  [home_url()](https://developer.wordpress.org/reference/functions/home_url/)`wp-includes/link-template.php` | Retrieves the URL for the current site where the front end is accessible.
  |
  [apply_filters()](https://developer.wordpress.org/reference/functions/apply_filters/)`wp-includes/plugin.php` | Calls the callback functions that have been added to a filter hook.
  |
  [is_wp_error()](https://developer.wordpress.org/reference/functions/is_wp_error/)`wp-includes/load.php` | Checks whether the given variable is a WordPress Error.
  |
  [WP_Error::__construct()](https://developer.wordpress.org/reference/classes/wp_error/__construct/)`wp-includes/class-wp-error.php` | Initializes the error.
  |
  [Show 9 more](#)[Show less](#) Used by | Description |
  [WP_Customize_Manager::handle_load_themes_request()](https://developer.wordpress.org/reference/classes/wp_customize_manager/handle_load_themes_request/)`wp-includes/class-wp-customize-manager.php` | Loads themes into the theme browsing/installation UI.
  |
  [wp_ajax_install_theme()](https://developer.wordpress.org/reference/functions/wp_ajax_install_theme/)`wp-admin/includes/ajax-actions.php` | Handles installing a theme via AJAX.
  |
  [Theme_Upgrader::check_parent_theme_filter()](https://developer.wordpress.org/reference/classes/theme_upgrader/check_parent_theme_filter/)`wp-admin/includes/class-theme-upgrader.php` | Checks if a child theme is being installed and its parent also needs to be installed.
  |
  [get_theme_feature_list()](https://developer.wordpress.org/reference/functions/get_theme_feature_list/)`wp-admin/includes/theme.php` | Retrieves list of WordPress theme features (aka theme tags).
  |
  [install_themes_feature_list()](https://developer.wordpress.org/reference/functions/install_themes_feature_list/)`wp-admin/includes/theme-install.php` | Retrieves the list of WordPress theme features (aka theme tags).
  |
  [install_theme_information()](https://developer.wordpress.org/reference/functions/install_theme_information/)`wp-admin/includes/theme-install.php` | Displays theme information in dialog box form.
  |
  [WP_Theme_Install_List_Table::prepare_items()](https://developer.wordpress.org/reference/classes/wp_theme_install_list_table/prepare_items/)`wp-admin/includes/class-wp-theme-install-list-table.php` | |
  [wp_ajax_query_themes()](https://developer.wordpress.org/reference/functions/wp_ajax_query_themes/)`wp-admin/includes/ajax-actions.php` | Handles getting themes from [themes_api()](https://developer.wordpress.org/reference/functions/themes_api/) via AJAX.
  |
  [Show 3 more](#)[Show less](#)
  [Changelog](#changelog) Version | Description |
  [2.8.0](https://developer.wordpress.org/reference/since/2.8.0/) | Introduced. |
  
  [User Contributed Notes](#user-contributed-notes)
  -
  
  [Skip to note 2 content](#comment-content-3720)
  
  [Meet Makadia](https://profiles.wordpress.org/immeet94/)
  [
  
  6 years ago
  ](https://developer.wordpress.org/reference/functions/themes_api/#comment-3720)
  
  [You must log in to vote on the helpfulness of this note ](https://login.wordpress.org?redirect_to=https%3A%2F%2Fdeveloper.wordpress.org%2Freference%2Ffunctions%2Fthemes_api%2F%23comment-3720)Vote results for this note: 0 [You must log in to vote on the helpfulness of this note ](https://login.wordpress.org?redirect_to=https%3A%2F%2Fdeveloper.wordpress.org%2Freference%2Ffunctions%2Fthemes_api%2F%23comment-3720)
  
  ```
  $theme_slug = 'plugin-slug-name';
  
  if ( ! function_exists( 'themes_api' ) ) {
  require_once( ABSPATH . 'wp-admin/includes/theme.php' );
  }
  
  if ( ! empty( $theme_slug ) ) {
  $args = array(
  'slug' => $theme_slug,
  );
  }
  
  /** Prepare our query */
  $call_api = themes_api( 'theme_information', $args );
  ```
  
  [Log in to add feedback](https://login.wordpress.org/?redirect_to=https%3A%2F%2Fdeveloper.wordpress.org%2Freference%2Ffunctions%2Fthemes_api%2F%3Freplytocom%3D3720%23feedback-editor-3720)

## Возвращаемое значение

`object|array|WP_Error` — WP_Error справочную статью по функции $action

## Исходный код

Файл: `wp-admin/includes/theme.php:491`

```php
function themes_api( $action, $args = array() ) {
	if ( is_array( $args ) ) {
		$args = (object) $args;
	}

	if ( 'query_themes' === $action ) {
		if ( ! isset( $args->per_page ) ) {
			$args->per_page = 24;
		}
	}

	if ( ! isset( $args->locale ) ) {
		$args->locale = get_user_locale();
	}

	if ( ! isset( $args->wp_version ) ) {
		$args->wp_version = substr( wp_get_wp_version(), 0, 3 ); // x.y
	}

	/**
	 * Filters arguments used to query for installer pages from the WordPress.org Themes API.
	 *
	 * Important: An object MUST be returned to this filter.
	 *
	 * @since 2.8.0
	 *
	 * @param object $args   Arguments used to query for installer pages from the WordPress.org Themes API.
	 * @param string $action Requested action. Likely values are 'theme_information',
	 *                       'feature_list', or 'query_themes'.
	 */
	$args = apply_filters( 'themes_api_args', $args, $action );

	/**
	 * Filters whether to override the WordPress.org Themes API.
	 *
	 * Returning a non-false value will effectively short-circuit the WordPress.org API request.
	 *
	 * If `$action` is 'query_themes', 'theme_information', or 'feature_list', an object MUST
	 * be passed. If `$action` is 'hot_tags', an array should be passed.
	 *
	 * @since 2.8.0
	 *
	 * @param false|object|array $override Whether to override the WordPress.org Themes API. Default false.
	 * @param string             $action   Requested action. Likely values are 'theme_information',
	 *                                    'feature_list', or 'query_themes'.
	 * @param object             $args     Arguments used to query for installer pages from the Themes API.
	 */
	$res = apply_filters( 'themes_api', false, $action, $args );

	if ( ! $res ) {
		$url = 'https://api.wordpress.org/themes/info/1.2/';
		$url = add_query_arg(
			array(
				'action'  => $action,
				'request' => $args,
			),
			$url
		);

		$http_url = $url;
		$ssl      = wp_http_supports( array( 'ssl' ) );
		if ( $ssl ) {
			$url = set_url_scheme( $url, 'https' );
		}

		$http_args = array(
			'timeout'    => 15,
			'user-agent' => 'WordPress/' . wp_get_wp_version() . '; ' . home_url( '/' ),
		);
		$request   = wp_remote_get( $url, $http_args );

		if ( $ssl && is_wp_error( $request ) ) {
			if ( ! wp_doing_ajax() ) {
				wp_trigger_error(
					__FUNCTION__,
					sprintf(
						/* translators: %s: Support forums URL. */
						__( 'An unexpected error occurred. Something may be wrong with WordPress.org or this server&#8217;s configuration. If you continue to have problems, please try the <a href="%s">support forums</a>.' ),
						__( 'https://wordpress.org/support/forums/' )
					) . ' ' . __( '(WordPress could not establish a secure connection to WordPress.org. Please contact your server administrator.)' ),
					headers_sent() || WP_DEBUG ? E_USER_WARNING : E_USER_NOTICE
				);
			}
			$request = wp_remote_get( $http_url, $http_args );
		}

		if ( is_wp_error( $request ) ) {
			$res = new WP_Error(
				'themes_api_failed',
				sprintf(
					/* translators: %s: Support forums URL. */
					__( 'An unexpected error occurred. Something may be wrong with WordPress.org or this server&#8217;s configuration. If you continue to have problems, please try the <a href="%s">support forums</a>.' ),
					__( 'https://wordpress.org/support/forums/' )
				),
				$request->get_error_message()
			);
		} else {
			$res = json_decode( wp_remote_retrieve_body( $request ), true );
			if ( is_array( $res ) ) {
				// Object casting is required in order to match the info/1.0 format.
				$res = (object) $res;
			} elseif ( null === $res ) {
				$res = new WP_Error(
					'themes_api_failed',
					sprintf(
						/* translators: %s: Support forums URL. */
						__( 'An unexpected error occurred. Something may be wrong with WordPress.org or this server&#8217;s configuration. If you continue to have problems, please try the <a href="%s">support forums</a>.' ),
						__( 'https://wordpress.org/support/forums/' )
					),
					wp_remote_retrieve_body( $request )
				);
			}

			if ( isset( $res->error ) ) {
				$res = new WP_Error( 'themes_api_failed', $res->error );
			}
		}

		if ( ! is_wp_error( $res ) ) {
			// Back-compat for info/1.2 API, upgrade the theme objects in query_themes to objects.
			if ( 'query_themes' === $action ) {
				foreach ( $res->themes as $i => $theme ) {
					$res->themes[ $i ] = (object) $theme;
				}
			}

			// Back-compat for info/1.2 API, downgrade the feature_list result back to an array.
			if ( 'feature_list' === $action ) {
				$res = (array) $res;
			}
		}
	}

	/**
	 * Filters the returned WordPress.org Themes API response.
	 *
	 * @since 2.8.0
	 *
	 * @param array|stdClass|WP_Error $res    WordPress.org Themes API response.
	 * @param string                  $action Requested action. Likely values are 'theme_information',
	 *                                        'feature_list', or 'query_themes'.
	 * @param stdClass                $args   Arguments used to query for installer pages from the WordPress.org Themes API.
	 */
	return apply_filters( 'themes_api_result', $res, $action, $args );
}
```

## История изменений

- 2.8.0 — Introduced.

## Связанные

Использует: [`wp_get_wp_version`](https://chugunov.pro/api-wordpress/functions/wp_get_wp_version/), [`wp_trigger_error`](https://chugunov.pro/api-wordpress/functions/wp_trigger_error/), [`wp_doing_ajax`](https://chugunov.pro/api-wordpress/functions/wp_doing_ajax/), [`get_user_locale`](https://chugunov.pro/api-wordpress/functions/get_user_locale/), [`set_url_scheme`](https://chugunov.pro/api-wordpress/functions/set_url_scheme/), [`wp_http_supports`](https://chugunov.pro/api-wordpress/functions/wp_http_supports/), [`wp_remote_get`](https://chugunov.pro/api-wordpress/functions/wp_remote_get/), [`wp_remote_retrieve_body`](https://chugunov.pro/api-wordpress/functions/wp_remote_retrieve_body/), [`__`](https://chugunov.pro/api-wordpress/functions/__/), [`add_query_arg`](https://chugunov.pro/api-wordpress/functions/add_query_arg/), [`home_url`](https://chugunov.pro/api-wordpress/functions/home_url/), [`apply_filters`](https://chugunov.pro/api-wordpress/functions/apply_filters/), [`is_wp_error`](https://chugunov.pro/api-wordpress/functions/is_wp_error/), `WP_Error::__construct`.
Используется в: `WP_Customize_Manager::handle_load_themes_request`, [`wp_ajax_install_theme`](https://chugunov.pro/api-wordpress/functions/wp_ajax_install_theme/), `Theme_Upgrader::check_parent_theme_filter`, [`get_theme_feature_list`](https://chugunov.pro/api-wordpress/functions/get_theme_feature_list/), [`install_themes_feature_list`](https://chugunov.pro/api-wordpress/functions/install_themes_feature_list/), [`install_theme_information`](https://chugunov.pro/api-wordpress/functions/install_theme_information/), `WP_Theme_Install_List_Table::prepare_items`, [`wp_ajax_query_themes`](https://chugunov.pro/api-wordpress/functions/wp_ajax_query_themes/), [`themes_api`](https://chugunov.pro/api-wordpress/functions/themes_api/).

Оригинал в официальной документации: https://developer.wordpress.org/reference/functions/themes_api/
