this code adds a custom css field on your each posts and pages

for your custom CSS to work you need to assign a class name to your each block you want to customize otherwise it wont work.

and then write your custom code it will work fine.
add this to your functions.php.
// 1. Add a meta box for custom CSS in the Gutenberg editor
function custom_css_meta_box() {
add_meta_box(
'custom_css',
'Custom CSS',
'custom_css_meta_box_callback',
array( 'post', 'page' ),
'side',
'high'
);
}
function custom_css_meta_box_callback( $post ) {
// Add a nonce for security
wp_nonce_field( 'save_custom_css', 'custom_css_nonce' );
// Get the current CSS value if it exists
$current_css = get_post_meta( $post->ID, '_custom_css', true );
echo '<textarea class="custom-css-for-posts-pages" style="width:100%; height: 150px;" name="custom_css">' . esc_textarea( $current_css ) . '</textarea>';
}
function save_custom_css( $post_id ) {
// Verify nonce
if( ! isset( $_POST['custom_css_nonce'] ) || ! wp_verify_nonce( $_POST['custom_css_nonce'], 'save_custom_css' ) )
return;
if ( defined( 'DOING_AUTOSAVE' ) && DOING_AUTOSAVE )
return;
if( isset( $_POST['custom_css'] ) ) {
update_post_meta( $post_id, '_custom_css', sanitize_text_field( $_POST['custom_css'] ) );
}
}
add_action( 'add_meta_boxes', 'custom_css_meta_box' );
add_action( 'save_post', 'save_custom_css' );
// 2. Add the custom CSS to the frontend
function print_custom_css() {
if( is_singular( array( 'post', 'page' ) ) ) {
$custom_css = get_post_meta( get_the_ID(), '_custom_css', true );
if( ! empty( $custom_css ) ) {
echo '<style type="text/css">' . esc_html( $custom_css ) . '</style>';
}
}
}
add_action( 'wp_head', 'print_custom_css' );
// 3. Enqueue the custom CSS in the Gutenberg editor
function enqueue_custom_css_for_gutenberg() {
if( isset( $_GET['post'] ) ) {
$post_id = intval( $_GET['post'] );
$custom_css = get_post_meta( $post_id, '_custom_css', true );
if( ! empty( $custom_css ) ) {
wp_add_inline_style( 'wp-codemirror', $custom_css );
}
}
}
add_action( 'enqueue_block_editor_assets', 'enqueue_custom_css_for_gutenberg' );
note:
there 2 missing feature that Ididnt implement because makes the code more complicated and it has to be plugin wont work like this easy 🙂
1 – it doesn’t support realtime result you need to save and look at front end or refresh the editor to see the result
2 – I was planning to add custom CSS for each block but I think this is much simpler way having only one CSS per page.
maybe I implement another code for both of this features.