Skip to content

Commit

Permalink
Initial effort
Browse files Browse the repository at this point in the history
  • Loading branch information
getdave committed Dec 11, 2024
1 parent 6cfeadc commit aedb880
Show file tree
Hide file tree
Showing 6 changed files with 116 additions and 12 deletions.
25 changes: 25 additions & 0 deletions lib/rest-api.php
Original file line number Diff line number Diff line change
Expand Up @@ -37,3 +37,28 @@ function gutenberg_register_edit_site_export_controller_endpoints() {
$edit_site_export_controller->register_routes();
}
add_action( 'rest_api_init', 'gutenberg_register_edit_site_export_controller_endpoints' );


function gutenberg_register_archive_link_field() {
register_rest_field(
'type',
'archive_link',
array(
'get_callback' => function( $post_object ) {
if ( isset( $post_object['has_archive'] ) && $post_object['has_archive'] ) {
$post_type = $post_object['slug'];
$archive_link = get_post_type_archive_link( $post_type );
return $archive_link ? $archive_link : '';
}
return '';
},
'update_callback' => null,
'schema' => array(
'description' => __( 'Link to the post type archive page', 'default' ),
'type' => 'string',
'context' => array( 'view', 'edit' ),
),
)
);
}
add_action( 'rest_api_init', 'gutenberg_register_archive_link_field' );
23 changes: 13 additions & 10 deletions packages/block-editor/src/components/link-control/search-item.js
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ import {
file,
home,
verse,
customPostType,
} from '@wordpress/icons';
import { __unstableStripHTML as stripHTML } from '@wordpress/dom';
import { safeDecodeURI, filterURLForDisplay, getPath } from '@wordpress/url';
Expand Down Expand Up @@ -41,18 +42,16 @@ function SearchItemIcon( { isURL, suggestion } ) {
icon = verse;
}
}
} else {
icon = customPostType;
}

if ( icon ) {
return (
<Icon
className="block-editor-link-control__search-item-icon"
icon={ icon }
/>
);
}

return null;
return (
<Icon
className="block-editor-link-control__search-item-icon"
icon={ icon }
/>
);
}

/**
Expand Down Expand Up @@ -155,6 +154,10 @@ function getVisualTypeName( suggestion ) {
return 'blog home';
}

if ( suggestion.kind === 'post-type-archive' ) {
return 'archive';
}

// Rename 'post_tag' to 'tag'. Ideally, the API would return the localised CPT or taxonomy label.
return suggestion.type === 'post_tag' ? 'tag' : suggestion.type;
}
Expand Down
22 changes: 22 additions & 0 deletions packages/block-library/src/navigation-link/index.php
Original file line number Diff line number Diff line change
Expand Up @@ -371,6 +371,7 @@ function block_core_navigation_link_filter_variations( $variations, $block_type
* @return array
*/
function block_core_navigation_link_build_variations() {

$post_types = get_post_types( array( 'show_in_nav_menus' => true ), 'objects' );
$taxonomies = get_taxonomies( array( 'show_in_nav_menus' => true ), 'objects' );

Expand All @@ -392,6 +393,27 @@ function block_core_navigation_link_build_variations() {
$variations[] = $variation;
}
}

// If any of the post types have `has_archive` set to true then add a post-type-archive variation.
$has_archive = array_filter(
$post_types,
function ( $post_type ) {
return $post_type->has_archive;
}
);

if ( $has_archive ) {
$variation = array(
'name' => 'post-type-archive',
'title' => __( 'Post Type Archive Link' ),
'description' => __( 'A link to a post type archive' ),
'attributes' => array(
'type' => 'all',
'kind' => 'post-type-archive',
),
);
$variations[] = $variation;
}
}
if ( $taxonomies ) {
foreach ( $taxonomies as $taxonomy ) {
Expand Down
3 changes: 3 additions & 0 deletions packages/block-library/src/navigation-link/link-ui.js
Original file line number Diff line number Diff line change
Expand Up @@ -63,6 +63,9 @@ export function getSuggestionsQuery( type, kind ) {
if ( kind === 'taxonomy' ) {
return { type: 'term', subtype: type };
}
if ( kind === 'post-type-archive' ) {
return { type: 'post-type-archive' };
}
if ( kind === 'post-type' ) {
return { type: 'post', subtype: type };
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ export type SearchOptions = {
/**
* Filters by search type.
*/
type?: 'attachment' | 'post' | 'term' | 'post-format';
type?: 'attachment' | 'post' | 'term' | 'post-format' | 'post-type-archive';
/**
* Slug of the post-type or taxonomy.
*/
Expand Down Expand Up @@ -58,6 +58,12 @@ type MediaAPIResult = {
type: string;
};

type PostTypesAPIResult = {
slug: string;
name: string;
archive_link: string;
};

export type SearchResult = {
/**
* Post or term id.
Expand Down Expand Up @@ -240,6 +246,34 @@ export default async function fetchLinkSuggestions(
);
}

if ( ! type || type === 'post-type-archive' ) {
queries.push(
apiFetch< PostTypesAPIResult[] >( {
path: addQueryArgs( '/wp/v2/types', {
page,
per_page: perPage,
} ),
} )
.then( ( results ) => {
const resultValues = Object.values( results );
return resultValues
.filter( ( result ) => !! result.archive_link ) // Filter out results with falsy archive_link, including empty strings
.map( ( result, index ) => {
return {
id: index + 1, // avoid results being filtered due to falsy id
url: result.archive_link,
title:
decodeEntities( result.name || '' ) ||
__( '(no title)' ),
type: result.slug,
kind: 'post-type-archive',
};
} );
} )
.catch( () => [] ) // Fail by returning no results.
);
}

const responses = await Promise.all( queries );

let results = responses.flat();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -86,6 +86,16 @@ jest.mock( '@wordpress/api-fetch', () =>
'http://localhost:8888/wp-content/uploads/2022/03/test-pdf.pdf',
},
] );
case '/wp/v2/search?search=&per_page=20&type=post-type-archive':
return Promise.resolve( [
{
id: 'books',
title: 'All Books',
url: 'http://wordpress.local/books/',
type: 'books-archive',
kind: 'post-type-archive',
},
] );
default:
return Promise.resolve( [
{
Expand Down Expand Up @@ -187,7 +197,7 @@ describe( 'fetchLinkSuggestions', () => {
);
} );

it( 'returns suggestions from post, term, post-format and media', () => {
it( 'returns suggestions from post, term, post-format, media and post-type-archive', () => {
return fetchLinkSuggestions( '', {} ).then( ( suggestions ) =>
expect( suggestions ).toEqual( [
{
Expand Down Expand Up @@ -232,6 +242,13 @@ describe( 'fetchLinkSuggestions', () => {
type: 'attachment',
kind: 'media',
},
{
id: 'books',
title: 'All Books',
url: 'http://wordpress.local/books/',
type: 'books-archive',
kind: 'post-type-archive',
},
] )
);
} );
Expand Down

0 comments on commit aedb880

Please sign in to comment.