'A single breadcrumb item', 'fields' => array( 'label' => array( 'type' => array( 'non_null' => 'String' ), 'description' => 'The display label for the breadcrumb', ), 'uri' => array( 'type' => 'String', 'description' => 'The URI for the breadcrumb link (null for current page)', ), ), ) ); } // Add 'breadcrumbs' field to all Node types add_action( 'graphql_register_types', 'ccat_register_breadcrumb_graphql_fields' ); function ccat_register_breadcrumb_graphql_fields() { register_graphql_field( 'Node', 'breadcrumbs', array( 'type' => array( 'list_of' => 'BreadcrumbItem' ), 'description' => 'Breadcrumb navigation items for this content', 'resolve' => function ( $node ) { return ccat_get_breadcrumbs( $node ); }, ) ); } // Helper: Get breadcrumbs for a given node function ccat_get_breadcrumbs( $node ) { $breadcrumbs = array(); if ( ! $node ) { return $breadcrumbs; } // Handle WPGraphQL Model objects if ( $node instanceof \WPGraphQL\Model\Post ) { $post = get_post( $node->databaseId ); if ( $post ) { $breadcrumbs = ccat_get_post_breadcrumbs( $post ); $breadcrumbs[] = array( 'label' => get_the_title( $post->ID ), 'uri' => null, ); } } elseif ( $node instanceof \WPGraphQL\Model\Term ) { $term = get_term( $node->databaseId ); if ( $term && ! is_wp_error( $term ) ) { $breadcrumbs = ccat_get_term_breadcrumbs( $term ); $breadcrumbs[] = array( 'label' => $term->name, 'uri' => null, ); } } return $breadcrumbs; } // Helper: Get breadcrumbs for a given post function ccat_get_post_breadcrumbs( $post ) { $breadcrumbs = array(); $post_type = get_post_type( $post->ID ); switch ( $post_type ) { case 'page': $ancestors = get_post_ancestors( $post->ID ); if ( ! empty( $ancestors ) ) { $ancestors = array_reverse( $ancestors ); foreach ( $ancestors as $ancestor_id ) { $breadcrumbs[] = array( 'label' => html_entity_decode( get_the_title( $ancestor_id ), ENT_QUOTES, 'UTF-8' ), 'uri' => str_replace( home_url(), '', get_permalink( $ancestor_id ) ), ); } } break; case 'post': $breadcrumbs[] = array( 'label' => 'Actualités', 'uri' => '/actualites/', ); break; case 'event': $breadcrumbs[] = array( 'label' => 'Événements', 'uri' => '/evenements/', ); break; case 'location': $breadcrumbs[] = array( 'label' => 'Lieux', 'uri' => '/lieux/', ); break; case 'membership': $breadcrumbs[] = array( 'label' => 'Membres', 'uri' => '/membres/', ); break; case 'project': $breadcrumbs[] = array( 'label' => 'Projets', 'uri' => '/projets/', ); break; case 'resource': $breadcrumbs[] = array( 'label' => 'Ressources', 'uri' => '/ressources/', ); break; } return $breadcrumbs; } // Helper: Get breadcrumbs for a given term function ccat_get_term_breadcrumbs( $term ) { $breadcrumbs = array(); $taxonomy = $term->taxonomy; if ( $term->parent ) { $ancestors = get_ancestors( $term->term_id, $taxonomy ); if ( ! empty( $ancestors ) ) { $ancestors = array_reverse( $ancestors ); foreach ( $ancestors as $ancestor_id ) { $ancestor_term = get_term( $ancestor_id, $taxonomy ); if ( $ancestor_term && ! is_wp_error( $ancestor_term ) ) { $breadcrumbs[] = array( 'label' => html_entity_decode( $ancestor_term->name, ENT_QUOTES, 'UTF-8' ), 'uri' => str_replace( home_url(), '', get_term_link( $ancestor_term ) ), ); } } } } switch ( $taxonomy ) { case 'category': $breadcrumbs = array_merge( array( array( 'label' => 'Catégories', 'uri' => '/categories/', ), ), $breadcrumbs ); break; case 'discipline': $breadcrumbs = array_merge( array( array( 'label' => 'Disciplines', 'uri' => '/disciplines/', ), ), $breadcrumbs ); break; case 'project-category': $breadcrumbs = array_merge( array( array( 'label' => 'Catégories de projets', 'uri' => '/categories-projets/', ), ), $breadcrumbs ); break; case 'resource-category': $breadcrumbs = array_merge( array( array( 'label' => 'Catégories de ressources', 'uri' => '/categories-ressources/', ), ), $breadcrumbs ); break; } return $breadcrumbs; }