Automattic\WooCommerce\Internal\Admin\Settings\SettingsUIPages

ProductsSettingsPageAdapter{}finalWC 10.9.0└─ LegacySettingsPageAdapter

Adapts the WooCommerce Products settings page for the settings UI renderer.

No Hooks.

Usage

$ProductsSettingsPageAdapter = new ProductsSettingsPageAdapter();
// use class methods

Methods

  1. public get_schema( string $section )
  2. private get_page_options()
  3. private with_field_options( array $schema, string $field_id, array $options )

Changelog

Since 10.9.0 Introduced.

ProductsSettingsPageAdapter{} code WC 10.9.1

final class ProductsSettingsPageAdapter extends LegacySettingsPageAdapter {

	/**
	 * Build the canonical settings schema for a section.
	 *
	 * @param string $section Section id. Empty string means the default section.
	 * @return array
	 */
	public function get_schema( string $section ): array {
		$schema = parent::get_schema( $section );

		$schema['shell']['title'] = __( 'Product settings', 'woocommerce' );

		if ( '' === $section ) {
			$schema = $this->with_field_options(
				$schema,
				'woocommerce_shop_page_id',
				$this->get_page_options()
			);
		}

		return $schema;
	}

	/**
	 * Add options to a field in a schema.
	 *
	 * @param array  $schema Schema.
	 * @param string $field_id Field id.
	 * @param array  $options Field options.
	 * @return array
	 */
	private function with_field_options( array $schema, string $field_id, array $options ): array {
		if ( empty( $options ) || ! isset( $schema['groups'] ) || ! is_array( $schema['groups'] ) ) {
			return $schema;
		}

		foreach ( $schema['groups'] as $group_id => $group ) {
			if ( ! isset( $group['fields'] ) || ! is_array( $group['fields'] ) ) {
				continue;
			}

			foreach ( $group['fields'] as $field_index => $field ) {
				if ( ! is_array( $field ) || ( $field['id'] ?? null ) !== $field_id ) {
					continue;
				}

				$schema['groups'][ $group_id ]['fields'][ $field_index ]['options'] = $options;
				return $schema;
			}
		}

		return $schema;
	}

	/**
	 * Build the page options for the shop page selector.
	 *
	 * @return array<int, array{label: string, value: string}>
	 */
	private function get_page_options(): array {
		$pages = get_pages(
			array(
				'sort_column' => 'menu_order',
				'sort_order'  => 'ASC',
				'post_status' => array( 'publish', 'private', 'draft' ),
			)
		);

		$options = array(
			array(
				'label' => __( 'Select a page...', 'woocommerce' ),
				'value' => '',
			),
		);

		if ( ! is_array( $pages ) ) {
			return $options;
		}

		foreach ( $pages as $page ) {
			$options[] = array(
				'label' => wp_strip_all_tags( $page->post_title ),
				'value' => (string) $page->ID,
			);
		}

		return $options;
	}
}