1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88
<?php
namespace WPGraphQL\Type\Union;
use GraphQL\Type\Definition\UnionType;
use WPGraphQL\Types;
/**
* Class PostObjectUnionType
*
* In WordPress, relations can be set to a post object by ID, but in many cases there's no strict control over what
* post_type the related post can be, so in many cases it's unknown what "post_type" the related post is until the post
* has been queried and returned. Some examples of such relations are:
*
* - Posts can have a parent_id set, and the parent_id can be of any post_type, so it's unknown what type of postObject
* will be returned until the query has been run.
*
* - Attachments (mediaItems) can be uploaded to any post_type as well, so their "uploadedTo" property can return any
* type of post object.
*
* @package WPGraphQL\Type\Union
* @since 0.0.6
*/
class PostObjectUnionType extends UnionType {
/**
* This holds an array of the possible types that can be resolved by this union
* @var array
* @since 0.0.6
*/
private static $possible_types;
/**
* PostObjectUnionType constructor.
* @since 0.0.6
*/
public function __construct() {
$config = [
'name' => 'PostObjectUnion',
'types' => function() {
return self::getPossibleTypes();
},
'resolveType' => function( $value ) {
return ! empty( $value->post_type ) ? Types::post_object( $value->post_type ) : null;
},
];
parent::__construct( $config );
}
/**
* This defines the possible types that can be resolved by this union
*
* @return array|null An array of possible types that can be resolved by the union
* @since 0.0.5
*/
public function getPossibleTypes() {
if ( null === self::$possible_types ) {
self::$possible_types = [];
}
$allowed_post_types = \WPGraphQL::$allowed_post_types;
if ( ! empty( $allowed_post_types ) && is_array( $allowed_post_types ) ) {
foreach ( $allowed_post_types as $allowed_post_type ) {
if ( empty( self::$possible_types[ $allowed_post_type ] ) ) {
self::$possible_types[ $allowed_post_type ] = Types::post_object( $allowed_post_type );
}
}
}
/**
* Filter the possible_types as it's possible some systems might set things like "parent_id" to a different
* object than a post_type, and might want to be able to hook in and add a non postObject type to the possible
* resolveTypes.
*
* @param array $possible_types An array of possible types that can be resolved for the union
* @since 0.0.6
*/
self::$possible_types = apply_filters( 'graphql_post_object_union_possible_types', self::$possible_types );
return ! empty( self::$possible_types ) ? self::$possible_types : null;
}
}