Files
wp-graphql-woocommerce/includes/mutation/class-product-category-create.php
Geoff TaylorandGitHub 088d337ef5 fix: address WordPress.org plugin review (rename + prefixing + headers) (#1019)
* fix: address WordPress.org plugin review feedback

- Prefix the session transaction queue transient with the plugin's
  graphql_woocommerce_ namespace instead of the generic "woo_" word, to
  avoid collisions (Plugin Directory: prefix data storage).
- Declare the WooCommerce dependency via the "Requires Plugins: woocommerce"
  plugin header.
- Bump README.txt "Tested up to" to 7.0.
- Ship composer.json in the distributed plugin (drop it, and composer.lock,
  from composer archive excludes) so the build is reproducible/reviewable.

* chore: rename plugin to "GraphQL for eCommerce" for trademark compliance

The WordPress.org plugin review flagged the display name/slug for beginning
with the "WPGraphQL" trademark (and the "WooGraphQL" portmanteau of the
WooCommerce mark), which can imply official affiliation.

- Display name (plugin header + readme title) -> "GraphQL for eCommerce".
- Slug/text domain -> "graphql-for-ecommerce" (header, all i18n string
  literals, and the PHPCS WordPress.WP.I18n text_domain config).
- Update user-facing notices/errors that named the old plugin.

"WooGraphQL" remains the project's informal nickname (repo, docs, community),
just not in the WordPress.org directory's official name/slug. Internal file
names and GitHub URLs are unchanged.

* fix: keep test-only dev deps out of the committed composer.json

The committed manifest mirrors develop (lint/stan dev deps only); CI adds the
test suite deps at runtime via `composer installTestEnv`. A previous commit
captured the installTestEnv-modified composer.json, desyncing it from
composer.lock and breaking `composer install` in CI.

* chore: regenerate composer.lock (refresh dev dependencies)

Regenerate the lock from the manifest so it is in sync (fixes the CI
`composer install` failure) and refresh dependencies in the process —
firebase/php-jwt v7.0.4 -> v7.1.0 plus 11 others, with vendor-prefixed
re-strauss'd to match. Full wpunit suite passes against the updated deps
(305 tests, 835 assertions).

* chore: rename text domain in createdVia/attribution strings from #1018

#1018 (createdVia + order attribution) merged into develop after the rename
commit was authored, so its new i18n strings still used the old
'wp-graphql-woocommerce' text domain. Update them to 'graphql-for-ecommerce'
to match the rename.
2026-06-30 10:16:21 -04:00

117 lines
3.3 KiB
PHP

<?php
/**
* Mutation - CreateProductCategory (additional fields)
*
* Registers additional WooCommerce-specific input fields and processes them
* on the core WPGraphQL CreateProductCategory mutation.
*
* @package WPGraphQL\WooCommerce\Mutation
* @since 0.22.0
*/
namespace WPGraphQL\WooCommerce\Mutation;
use WPGraphQL\Utils\Utils;
/**
* Class - Product_Category_Create
*/
class Product_Category_Create {
/**
* Registers the additional input fields and hooks.
*
* @return void
*/
public static function register() {
register_graphql_fields(
'CreateProductCategoryInput',
self::get_input_fields()
);
// Pass custom input fields through into the prepared args.
add_filter( 'graphql_term_object_insert_term_args', [ self::class, 'pass_through_input_fields' ], 10, 4 );
// Process custom fields after term creation.
add_action( 'graphql_insert_product_cat', [ self::class, 'process_additional_fields' ], 10, 2 );
}
/**
* Returns the additional WooCommerce-specific input fields.
*
* @return array<string,array<string,mixed>>
*/
public static function get_input_fields() {
return [
'display' => [
'type' => 'ProductCategoryDisplay',
'description' => static function () {
return __( 'Category archive display type.', 'graphql-for-ecommerce' );
},
],
'menuOrder' => [
'type' => 'Integer',
'description' => static function () {
return __( 'Menu order, used to custom sort the category.', 'graphql-for-ecommerce' );
},
],
'imageId' => [
'type' => 'ID',
'description' => static function () {
return __( 'The ID of an image attachment to associate with the category.', 'graphql-for-ecommerce' );
},
],
];
}
/**
* Passes custom input fields through into the prepared args so they are
* available in the `graphql_insert_product_cat` action.
*
* @param array<string,mixed> $insert_args The prepared insert args.
* @param array<string,mixed> $input The raw GraphQL input.
* @param \WP_Taxonomy $taxonomy The taxonomy object.
* @param string $mutation_name The mutation name.
*
* @return array<string,mixed>
*/
public static function pass_through_input_fields( $insert_args, $input, $taxonomy, $mutation_name ) {
if ( 'product_cat' !== $taxonomy->name ) {
return $insert_args;
}
$custom_fields = [ 'display', 'menuOrder', 'imageId' ];
foreach ( $custom_fields as $field ) {
if ( isset( $input[ $field ] ) ) {
$insert_args[ $field ] = $input[ $field ];
}
}
return $insert_args;
}
/**
* Processes the additional WooCommerce-specific fields after term insertion.
*
* @param int $term_id The created term ID.
* @param array<string,mixed> $args The prepared args from the mutation input.
*
* @return void
*/
public static function process_additional_fields( $term_id, $args ) {
if ( isset( $args['display'] ) ) {
update_term_meta( $term_id, 'display_type', sanitize_text_field( $args['display'] ) );
}
if ( isset( $args['menuOrder'] ) ) {
update_term_meta( $term_id, 'order', absint( $args['menuOrder'] ) );
}
if ( isset( $args['imageId'] ) ) {
$image_database_id = Utils::get_database_id_from_id( $args['imageId'] );
if ( $image_database_id ) {
update_term_meta( $term_id, 'thumbnail_id', absint( $image_database_id ) );
}
}
}
}