// Register Yoast SEO fields in WP REST API — correct approach
add_action('rest_api_init', function() {
$post_types = ['post', 'page'];
$yoast_fields = [
'_yoast_wpseo_title' => '_yoast_wpseo_title',
'_yoast_wpseo_metadesc' => '_yoast_wpseo_metadesc',
'_yoast_wpseo_focuskw' => '_yoast_wpseo_focuskw',
];
foreach ($post_types as $post_type) {
foreach ($yoast_fields as $field => $meta_key) {
register_rest_field($post_type, $field, [
'get_callback' => function($post) use ($meta_key) {
return get_post_meta($post['id'], $meta_key, true);
},
'update_callback' => function($value, $post) use ($meta_key) {
// Use WPSEO_Meta if available (triggers Yoast's own save)
if (class_exists('WPSEO_Meta')) {
$clean_key = str_replace('_yoast_wpseo_', '', $meta_key);
WPSEO_Meta::set_value($clean_key, sanitize_text_field($value), $post->ID);
} else {
update_post_meta($post->ID, $meta_key, sanitize_text_field($value));
}
},
'schema' => ['type' => 'string'],
]);
}
}
});