v1-pre
This commit is contained in:
parent
572552ff13
commit
847ed92c23
10 changed files with 1232 additions and 591 deletions
|
|
@ -30,33 +30,44 @@ class MLF_Font_Registry {
|
|||
'post_type' => 'wp_font_family',
|
||||
'name' => $font_slug,
|
||||
'posts_per_page' => 1,
|
||||
'post_status' => 'publish',
|
||||
'post_status' => 'any',
|
||||
]);
|
||||
|
||||
if (!empty($existing)) {
|
||||
return new WP_Error('font_exists', 'Font family already installed');
|
||||
}
|
||||
|
||||
// Get font directory
|
||||
// Get font directory info
|
||||
$font_dir = wp_get_font_dir();
|
||||
|
||||
// Build font face array for WordPress
|
||||
$font_faces = [];
|
||||
foreach ($files as $file) {
|
||||
$filename = basename($file['path']);
|
||||
$font_faces[] = [
|
||||
|
||||
// Determine if this is a variable font (weight is a range like "100 900")
|
||||
$is_variable = isset($file['is_variable']) && $file['is_variable'];
|
||||
$weight = $file['weight'];
|
||||
|
||||
$face_data = [
|
||||
'fontFamily' => $font_name,
|
||||
'fontWeight' => $file['weight'],
|
||||
'fontStyle' => $file['style'],
|
||||
'fontWeight' => $weight,
|
||||
'src' => 'file:./' . $filename,
|
||||
];
|
||||
|
||||
$font_faces[] = $face_data;
|
||||
}
|
||||
|
||||
// Build font family settings
|
||||
// Determine font category for fallback
|
||||
// Default to sans-serif, but could be enhanced to detect from Google Fonts metadata
|
||||
$fallback = 'sans-serif';
|
||||
|
||||
// Build font family settings (this is what Gutenberg reads)
|
||||
$font_family_settings = [
|
||||
'name' => $font_name,
|
||||
'slug' => $font_slug,
|
||||
'fontFamily' => sprintf('"%s", sans-serif', $font_name),
|
||||
'fontFamily' => "'{$font_name}', {$fallback}",
|
||||
'fontFace' => $font_faces,
|
||||
];
|
||||
|
||||
|
|
@ -67,7 +78,7 @@ class MLF_Font_Registry {
|
|||
'post_name' => $font_slug,
|
||||
'post_status' => 'publish',
|
||||
'post_content' => wp_json_encode($font_family_settings),
|
||||
]);
|
||||
], true);
|
||||
|
||||
if (is_wp_error($family_id)) {
|
||||
return $family_id;
|
||||
|
|
@ -77,13 +88,14 @@ class MLF_Font_Registry {
|
|||
update_post_meta($family_id, '_mlf_imported', '1');
|
||||
update_post_meta($family_id, '_mlf_import_date', current_time('mysql'));
|
||||
|
||||
// Create font face posts (children)
|
||||
// Create font face posts (children) - WordPress also reads these
|
||||
foreach ($files as $file) {
|
||||
$filename = basename($file['path']);
|
||||
$weight = $file['weight'];
|
||||
|
||||
$face_settings = [
|
||||
'fontFamily' => $font_name,
|
||||
'fontWeight' => $file['weight'],
|
||||
'fontWeight' => $weight,
|
||||
'fontStyle' => $file['style'],
|
||||
'src' => 'file:./' . $filename,
|
||||
];
|
||||
|
|
@ -91,15 +103,15 @@ class MLF_Font_Registry {
|
|||
wp_insert_post([
|
||||
'post_type' => 'wp_font_face',
|
||||
'post_parent' => $family_id,
|
||||
'post_title' => sprintf('%s %s %s', $font_name, $file['weight'], $file['style']),
|
||||
'post_title' => sprintf('%s %s %s', $font_name, $weight, $file['style']),
|
||||
'post_name' => sanitize_title(sprintf('%s-%s-%s', $font_slug, $weight, $file['style'])),
|
||||
'post_status' => 'publish',
|
||||
'post_content' => wp_json_encode($face_settings),
|
||||
]);
|
||||
}
|
||||
|
||||
// Clear font caches
|
||||
delete_transient('wp_font_library_fonts');
|
||||
delete_transient('mlf_imported_fonts_list');
|
||||
// Clear all font-related caches
|
||||
$this->clear_font_caches();
|
||||
|
||||
return $family_id;
|
||||
}
|
||||
|
|
@ -154,13 +166,40 @@ class MLF_Font_Registry {
|
|||
// Delete family post
|
||||
wp_delete_post($family_id, true);
|
||||
|
||||
// Clear caches
|
||||
delete_transient('wp_font_library_fonts');
|
||||
delete_transient('mlf_imported_fonts_list');
|
||||
// Clear all font-related caches
|
||||
$this->clear_font_caches();
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* Clear all font-related caches.
|
||||
*/
|
||||
private function clear_font_caches() {
|
||||
// Clear WordPress Font Library cache
|
||||
delete_transient('wp_font_library_fonts');
|
||||
|
||||
// Clear our plugin's cache
|
||||
delete_transient('mlf_imported_fonts_list');
|
||||
|
||||
// Clear global settings cache (used by Gutenberg)
|
||||
wp_cache_delete('wp_get_global_settings', 'theme_json');
|
||||
wp_cache_delete('wp_get_global_stylesheet', 'theme_json');
|
||||
|
||||
// Clear theme.json related caches
|
||||
delete_transient('global_styles');
|
||||
delete_transient('global_styles_' . get_stylesheet());
|
||||
|
||||
// Clear object cache for post queries
|
||||
wp_cache_flush_group('posts');
|
||||
|
||||
// Clear any theme mods cache
|
||||
delete_transient('theme_mods_' . get_stylesheet());
|
||||
|
||||
// Trigger action for other plugins/themes that might cache fonts
|
||||
do_action('mlf_fonts_cache_cleared');
|
||||
}
|
||||
|
||||
/**
|
||||
* Get all fonts imported by this plugin.
|
||||
*
|
||||
|
|
@ -193,9 +232,9 @@ class MLF_Font_Registry {
|
|||
|
||||
// Single query to get ALL font faces for ALL fonts (fixes N+1)
|
||||
$all_faces = get_posts([
|
||||
'post_type' => 'wp_font_face',
|
||||
'posts_per_page' => 1000, // Max 100 fonts × 9 weights × 2 styles = 1800, but limit reasonably
|
||||
'post_status' => 'publish',
|
||||
'post_type' => 'wp_font_face',
|
||||
'posts_per_page' => 1000,
|
||||
'post_status' => 'publish',
|
||||
'post_parent__in' => $font_ids,
|
||||
]);
|
||||
|
||||
|
|
@ -234,7 +273,11 @@ class MLF_Font_Registry {
|
|||
|
||||
// Sort variants by weight then style
|
||||
usort($variants, function($a, $b) {
|
||||
$weight_cmp = intval($a['weight']) - intval($b['weight']);
|
||||
// Handle weight ranges (variable fonts)
|
||||
$a_weight = is_numeric($a['weight']) ? intval($a['weight']) : intval(explode(' ', $a['weight'])[0]);
|
||||
$b_weight = is_numeric($b['weight']) ? intval($b['weight']) : intval(explode(' ', $b['weight'])[0]);
|
||||
|
||||
$weight_cmp = $a_weight - $b_weight;
|
||||
if ($weight_cmp !== 0) {
|
||||
return $weight_cmp;
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue