add this to your functions.php and you will have keywords and meta description fields in your posts and pages and post types.
this fields will render in <head> if they filled.
If you have very minimalistic website and don’t want SEO plugin here is your code have fun with it.
/**
* Add SEO meta fields to posts, pages, and custom post types
*/
function custom_add_seo_meta_fields() {
// Add meta fields for posts
add_meta_box('custom_seo_fields', 'SEO Meta Fields', 'custom_render_seo_meta_fields', 'post', 'normal', 'high');
// Add meta fields for pages
add_meta_box('custom_seo_fields', 'SEO Meta Fields', 'custom_render_seo_meta_fields', 'page', 'normal', 'high');
// Add meta fields for custom post types
$custom_post_types = get_post_types(array('_builtin' => false));
foreach ($custom_post_types as $post_type) {
add_meta_box('custom_seo_fields', 'SEO Meta Fields', 'custom_render_seo_meta_fields', $post_type, 'normal', 'high');
}
}
add_action('add_meta_boxes', 'custom_add_seo_meta_fields');
/**
* Render SEO meta fields
*/
function custom_render_seo_meta_fields($post) {
// Retrieve current values
$keywords = get_post_meta($post->ID, 'seo_keywords', true);
$description = get_post_meta($post->ID, 'seo_description', true);
// Output HTML for meta fields
wp_nonce_field('custom_save_seo_meta_fields', 'custom_seo_meta_nonce');
?>
<p>
<label for="seo_keywords">Keywords:</label><br>
<textarea name="seo_keywords" id="seo_keywords" rows="3"><?php echo esc_textarea($keywords); ?></textarea>
</p>
<p>
<label for="seo_description">Meta Description:</label><br>
<textarea name="seo_description" id="seo_description" rows="5" maxlength="155"><?php echo esc_textarea($description); ?></textarea>
</p>
<?php
}
/**
* Save SEO meta fields
*/
function custom_save_seo_meta_fields($post_id) {
// Verify nonce
if (!isset($_POST['custom_seo_meta_nonce']) || !wp_verify_nonce($_POST['custom_seo_meta_nonce'], 'custom_save_seo_meta_fields')) {
return;
}
// Save meta fields
if (isset($_POST['seo_keywords'])) {
update_post_meta($post_id, 'seo_keywords', sanitize_textarea_field($_POST['seo_keywords']));
}
if (isset($_POST['seo_description'])) {
update_post_meta($post_id, 'seo_description', sanitize_textarea_field($_POST['seo_description']));
}
}
add_action('save_post', 'custom_save_seo_meta_fields');
/**
* Enqueue styles and scripts for admin
*/
function custom_enqueue_admin_scripts() {
wp_enqueue_style('custom-admin-styles', get_template_directory_uri() . '/admin.css');
}
add_action('admin_enqueue_scripts', 'custom_enqueue_admin_scripts');
// Render custom meta keywords and description in the <head>
function custom_render_meta_tags() {
// Get the current post/page ID
$current_id = get_queried_object_id();
// Retrieve the custom meta keywords and description
$keywords = get_post_meta($current_id, 'seo_keywords', true);
$description = get_post_meta($current_id, 'seo_description', true);
if ($keywords) {
echo '
<!-- SEO FIELDS --!>
<meta name="keywords" content="' . esc_attr($keywords) . '">';
}
if ($description) {
echo '
<meta name="description" content="' . esc_attr($description) . '">
<!-- SEO FIELDS --!>
';
}
}
add_action('wp_head', 'custom_render_meta_tags');