ACF_Post_Type::ajax_validate_valuespublicACF 6.1

Validates post type values before allowing save from the global $_POST object. Errors are added to the form using acf_add_internal_post_type_validation_error().

Метод класса: ACF_Post_Type{}

Хуки из метода

Возвращает

true|false. validity status

Использование

$ACF_Post_Type = new ACF_Post_Type();
$ACF_Post_Type->ajax_validate_values();

Список изменений

С версии 6.1 Введена.

Код ACF_Post_Type::ajax_validate_values() ACF 6.4.2

public function ajax_validate_values() {
	if ( empty( $_POST['acf_post_type']['post_type'] ) ) { // phpcs:ignore WordPress.Security.NonceVerification.Missing -- Verified elsewhere.
		return false;
	}

	$post_type_key = acf_sanitize_request_args( wp_unslash( $_POST['acf_post_type']['post_type'] ) ); // phpcs:ignore WordPress.Security.NonceVerification.Missing -- Verified elsewhere.
	$post_type_key = is_string( $post_type_key ) ? $post_type_key : '';
	$valid         = true;

	if ( strlen( $post_type_key ) > 20 ) {
		$valid = false;
		acf_add_internal_post_type_validation_error( 'post_type', __( 'The post type key must be under 20 characters.', 'acf' ) );
	}

	if ( preg_match( '/^[a-z0-9_-]*$/', $post_type_key ) !== 1 ) {
		$valid = false;
		acf_add_internal_post_type_validation_error( 'post_type', __( 'The post type key must only contain lower case alphanumeric characters, underscores or dashes.', 'acf' ) );
	}

	if ( in_array( $post_type_key, acf_get_wp_reserved_terms(), true ) ) {
		$valid = false;
		/* translators: %s a link to WordPress.org's Reserved Terms page */
		$message = sprintf( __( 'This field must not be a WordPress <a href="%s" target="_blank">reserved term</a>.', 'acf' ), 'https://codex.wordpress.org/Reserved_Terms' );
		acf_add_internal_post_type_validation_error( 'post_type', $message );
	} else {
		// Check if this post key exists in the ACF store for registered post types, excluding those which failed registration.
		$store   = acf_get_store( $this->store );
		$post_id = (int) acf_maybe_get_POST( 'post_id', 0 );

		$matches    = array_filter(
			$store->get_data(),
			function ( $item ) use ( $post_type_key ) {
				return $item['post_type'] === $post_type_key && empty( $item['not_registered'] );
			}
		);
		$duplicates = array_filter(
			$matches,
			function ( $item ) use ( $post_id ) {
				return $item['ID'] !== $post_id;
			}
		);

		if ( $duplicates ) {
			$valid = false;
			acf_add_internal_post_type_validation_error( 'post_type', __( 'This post type key is already in use by another post type in ACF and cannot be used.', 'acf' ) );
		} else {
			// If we're not already in use with another ACF post type, check if we're registered, but not by ACF.
			if ( empty( $matches ) && post_type_exists( $post_type_key ) ) {
				$valid = false;
				acf_add_internal_post_type_validation_error( 'post_type', __( 'This post type key is already in use by another post type registered outside of ACF and cannot be used.', 'acf' ) );
			}
		}
	}

	$valid = apply_filters( "acf/{$this->hook_name}/ajax_validate_values", $valid, $_POST['acf_post_type'] ); // phpcs:ignore WordPress.Security -- Raw input send to hook for validation.

	return $valid;
}