Hello,
Thank you for testing this plugin.
Unfortunately Sublanguage doesn’t support the wordpress default “Custom Fields” metabox. Sorry, I should have make it clear in plugin description.
Alternatively you can code your own custom box using the custom box API (https://codex.wordpress.org/Function_Reference/add_meta_box). Then add this into your function.php to make your fields translatable:
add_filter('sublanguage_register_postmeta_key', 'my_translate_postmeta');
function my_translate_postmeta($postmeta_keys) {
$postmeta_keys[] = 'use_toc';
$postmeta_keys[] = 'side_image';
$postmeta_keys[] = 'title';
$postmeta_keys[] = 'title_image';
return $postmeta_keys;
}
Hello Maxime, thanks for the quick reply.
Unfortunately, my WP knowledge is minimal.
I’ve added your snippet in my theme ‘functions.php’, and added a custom meta box (actually a table with the 6 input fields I need).
The problem is how do I link this metabox with Sublanguage ? How can I make the magic operate đ ? The $post->ID I get in the add_meta_box callback is the original one, not the translated one.
Actually the magic is done by an invisible filter when you call get_post_meta() function. So just use the $post->ID and the value will be according to the current language… Doesn’t it work?
Hello again Maxime, I implemented also the code to save the custom fields. Now the custom fields work for all translations, except in the original English: the custom metabox values are always empty.
I also tried creating a new page in English (in case something was broken on my existing page), edit my custom fields, then switch to French and edit the custom fields: same result: the custom are OK for french, but not for English.
Here is my functions.php:
<?php
add_filter('sublanguage_register_postmeta_key','my_translate_postmeta');
function my_translate_postmeta($postmeta_keys)
{
array_push($postmeta_keys,"page_id","use_toc","title","title_image","side_text","side_image");
return $postmeta_keys;
}
add_action('add_meta_boxes','my_add_meta_boxes');
add_action('save_post','my_save_post');
function my_add_meta_boxes($post)
{
add_meta_box('metabox','Custom values','my_add_meta_box_content','page','normal','high');
}
function my_add_meta_box_content($post)
{
echo "<table>\n";
$keys=my_translate_postmeta(array());
foreach($keys as $k)
{
echo "<tr><td><label>$k:</label></td><td><input type='text' name='metabox_$k' value='".get_post_meta($post->ID,$k,true)."'/></td></tr>";
}
echo "</table>\n";
}
function my_save_post()
{
global $post;
if($_POST)
{
$keys=array();
$keys=my_translate_postmeta($keys);
foreach($keys as $k)
{
if(isset($_POST['metabox_'.$k]))
{
$meta=esc_attr($_POST['metabox_'.$k]);
update_post_meta($post->ID,$k,$meta);
}
}
}
}
I changed the Default and original language in Sublanguage’s settings to French, and now the French translation lost its custom fields in the editor, so probably connected to the ‘Main’ language of the post.
I’m probably making something wrong…
Hum… as an unpractical workaround, I’ve added a dummy language ‘Original’ also set to ‘en_US’ (with a different slug), and made it the ‘Original language’ in SL, but the drawback is that now I have to add a “translation” for English too. But now, I have working custom fields for all languages.
Hello,
Your code should work fine. I’am going to investigate what’s wrong and try to make a fix. I’ll let you know.
Strangely enough, it seams it works when i prefix meta key with a “_”.
Ca you try with this?
array_push($postmeta_keys,"_page_id","_use_toc","_title","_title_image","_side_text","_side_image");
Yup, prefixing with a “_” does the trick đ
Do you know why there is a difference in behaviour without the _ ?
Ok, I found a fix for this problem. I will release a plugin update later.
It seams meta key prefixed by underscore are considered “protected” by wordpress. But I don’t know what is the purpose of this, and I can’t find any documentation. I can’t tell you wether it’s better to use underscore prefix or not for meta keys.
Anyway the problem was elsewhere and as soon as you’ll update the plugin you’ll be able to use any meta keys.
Thank you for pointing me this problem.
I just released the 1.4.4 version of Sublanguage. I fixed this problem with meta keys. Please upgrade, it should work fine now.
However the wordpress default “Custom Fields” box is still not supported (for technical reasons).
WordPress considers underscored meta as ‘protected’. That’s means you can’t modify them in the admin page using the Custom Fields metabox but only through functions. Unprotected metas instead, appear in mentioned metabox as freely editable by users. So something like “id” should be protected where something like “subtitle” could be unprotected. Some must be protected for obv reasons, where sometimes it’s just a design choice.
Thank you for these precisions. Now Sublanguage can handle protected and unprotected meta fields as well.