@wordpress/block-library
Version:
Block library for the WordPress editor.
100 lines (96 loc) • 2.87 kB
JavaScript
/**
* WordPress dependencies
*/
import { store as coreStore } from '@wordpress/core-data';
import { useSelect } from '@wordpress/data';
export function useArchiveLabel() {
const templateSlug = useSelect( ( select ) => {
// @wordpress/block-library should not depend on @wordpress/editor.
// Blocks can be loaded into a *non-post* block editor, so to avoid
// declaring @wordpress/editor as a dependency, we must access its
// store by string.
// The solution here is to split WP specific blocks from generic blocks.
// eslint-disable-next-line @wordpress/data-no-store-string-literals
const { getCurrentPostId, getCurrentPostType, getCurrentTemplateId } =
select( 'core/editor' );
const currentPostType = getCurrentPostType();
const templateId =
getCurrentTemplateId() ||
( currentPostType === 'wp_template' ? getCurrentPostId() : null );
return templateId
? select( coreStore ).getEditedEntityRecord(
'postType',
'wp_template',
templateId
)?.slug
: null;
}, [] );
const taxonomyMatches = templateSlug?.match(
/^(category|tag|taxonomy-([^-]+))$|^(((category|tag)|taxonomy-([^-]+))-(.+))$/
);
let taxonomy;
let term;
let isAuthor = false;
let authorSlug;
if ( taxonomyMatches ) {
// If is for a all taxonomies of a type
if ( taxonomyMatches[ 1 ] ) {
taxonomy = taxonomyMatches[ 2 ]
? taxonomyMatches[ 2 ]
: taxonomyMatches[ 1 ];
}
// If is for a all taxonomies of a type
else if ( taxonomyMatches[ 3 ] ) {
taxonomy = taxonomyMatches[ 6 ]
? taxonomyMatches[ 6 ]
: taxonomyMatches[ 4 ];
term = taxonomyMatches[ 7 ];
}
taxonomy = taxonomy === 'tag' ? 'post_tag' : taxonomy;
//getTaxonomy( 'category' );
//wp.data.select('core').getEntityRecords( 'taxonomy', 'category', {slug: 'newcat'} );
} else {
const authorMatches = templateSlug?.match( /^(author)$|^author-(.+)$/ );
if ( authorMatches ) {
isAuthor = true;
if ( authorMatches[ 2 ] ) {
authorSlug = authorMatches[ 2 ];
}
}
}
return useSelect(
( select ) => {
const { getEntityRecords, getTaxonomy, getAuthors } =
select( coreStore );
let archiveTypeLabel;
let archiveNameLabel;
if ( taxonomy ) {
archiveTypeLabel =
getTaxonomy( taxonomy )?.labels?.singular_name;
}
if ( term ) {
const records = getEntityRecords( 'taxonomy', taxonomy, {
slug: term,
per_page: 1,
} );
if ( records && records[ 0 ] ) {
archiveNameLabel = records[ 0 ].name;
}
}
if ( isAuthor ) {
archiveTypeLabel = 'Author';
if ( authorSlug ) {
const authorRecords = getAuthors( { slug: authorSlug } );
if ( authorRecords && authorRecords[ 0 ] ) {
archiveNameLabel = authorRecords[ 0 ].name;
}
}
}
return {
archiveTypeLabel,
archiveNameLabel,
};
},
[ authorSlug, isAuthor, taxonomy, term ]
);
}