Чи є спосіб змінити текст кнопки публікації на користувацькому типі публікації, щоб сказати щось інше? Наприклад, Зберегти замість Опублікувати. А також видалити кнопку чернетки?
Чи є спосіб змінити текст кнопки публікації на користувацькому типі публікації, щоб сказати щось інше? Наприклад, Зберегти замість Опублікувати. А також видалити кнопку чернетки?
Відповіді:
Якщо ви заглянете /wp-admin/edit-form-advanced.php
, ви знайдете метаполе:
add_meta_box('submitdiv', __('Publish'), 'post_submit_meta_box', $post_type, 'side', 'core');
Зверніть увагу __('Publish')
- функція __()
призводить до того, translate()
де ви отримуєте фільтр 'gettext'
.
Є два способи вирішити вашу проблему: 1. Зверніться до рядка в одній спеціалізованій функції (не забудьте відповідати правильному textdomain!) Або 2. використовуйте більш загальний підхід.
@Rarst щойно опублікував версію 1, тому я додам версію 2. :)
<?php
/*
Plugin Name: Retranslate
Description: Adds translations.
Version: 0.1
Author: Thomas Scholz
Author URI: http://toscho.de
License: GPL v2
*/
class Toscho_Retrans {
// store the options
protected $params;
/**
* Set up basic information
*
* @param array $options
* @return void
*/
public function __construct( array $options )
{
$defaults = array (
'domain' => 'default'
, 'context' => 'backend'
, 'replacements' => array ()
, 'post_type' => array ( 'post' )
);
$this->params = array_merge( $defaults, $options );
// When to add the filter
$hook = 'backend' == $this->params['context']
? 'admin_head' : 'template_redirect';
add_action( $hook, array ( $this, 'register_filter' ) );
}
/**
* Conatiner for add_filter()
* @return void
*/
public function register_filter()
{
add_filter( 'gettext', array ( $this, 'translate' ), 10, 3 );
}
/**
* The real working code.
*
* @param string $translated
* @param string $original
* @param string $domain
* @return string
*/
public function translate( $translated, $original, $domain )
{
// exit early
if ( 'backend' == $this->params['context'] )
{
global $post_type;
if ( ! empty ( $post_type )
&& ! in_array( $post_type, $this->params['post_type'] ) )
{
return $translated;
}
}
if ( $this->params['domain'] !== $domain )
{
return $translated;
}
// Finally replace
return strtr( $original, $this->params['replacements'] );
}
}
// Sample code
// Replace 'Publish' with 'Save' and 'Preview' with 'Lurk' on pages and posts
$Toscho_Retrans = new Toscho_Retrans(
array (
'replacements' => array (
'Publish' => 'Save'
, 'Preview' => 'Lurk'
)
, 'post_type' => array ( 'page', 'post' )
)
);
Вам не потрібно використовувати код як плагін. Включення його у свою функцію теми.php буде достатньо.
Щоб видалити оригінальну кнопку "Зберегти" (не впевнений, що таке "чернетка"), додайте наступний код до своїх функцій.php / плагін:
add_action( 'admin_print_footer_scripts', 'remove_save_button' );
function remove_save_button()
{
?>
<script>
jQuery(document).ready(function($){$('#save-post').remove();});
</script><?php
}
Так, це некрасиво.
post_submit_meta_box()
просто викидає її вміст. Фільтр взагалі немає. Javascript або ob_start()
міг це вирішити. Обидва не дуже елегантні.
Код для пропозиції хакре про використання фільтра перекладу був би приблизно таким:
add_filter( 'gettext', 'change_publish_button', 10, 2 );
function change_publish_button( $translation, $text ) {
if ( $text == 'Publish' )
return 'Save';
return $translation;
}
Це не повна відповідь, але деякі вказівки: Будь-який відображений текст перевершує фільтр перекладу і тому може бути змінений у функції зворотного дзвінка (гачок). Тож якщо гачок зареєстрований лише на тій сторінці, де ви хочете це змінити, робота виконана.
Кнопку чернетки можна було "зняти", сховавши її за допомогою CSS. CSS може бути введений в <head>
-tag адміністратора з іншим зворотним дзвінком. Я думаю, що для цього потрібен фільтр admin_head
. Це якось брудно, оскільки кнопка все ще є, наприклад, якщо користувач вимикає CSS.
Для послідовності, я припускаю, що ви віддаєте перевагу використовувати "Зберегти", а не "Опублікувати" на всьому Wordpress, а не лише на тексті кнопки.
На основі рішення, наданого @Rarst, я розширив код, щоб він перекладав багато (усі?) Інші екземпляри слова "Опублікувати" у відповідну варіацію "Зберегти".
add_filter("gettext", "translate_publish_post_status", 10, 2);
add_filter("ngettext", "translate_publish_post_status_number", 10, 5);
add_filter("ngettext_with_context", "translate_publish_post_status_number", 10, 6);
function translate_publish_post_status($translation, $text) {
switch($text) {
case "Publish": return "Save";
case "Published on: <b>%1\$s</b>": return "Saved on: <b>%1\$s</b>";
case "Publish <b>immediately</b>": return "Approve <b>immediately</b>";
case "Publish on: <b>%1\$s</b>": return "Approve on: <b>%1\$s</b>";
case "Privately Published": return "Privately Saved";
case "Published": return "Saved";
case "Save & Publish": return "Save"; //"Double-save"? :)
default: return $translation;
}
}
function translate_publish_post_status_number($translation, $single, $plural, $number, $domain) {
if($translation == "Published <span class=\"count\">(%s)</span>") {
return "Saved <span class=\"count\">(%s)</span>";
}
return $translation;
}
Для видалення кнопки Чернетка відповідь, надана @toscho, містить хороше рішення.
%1$s
до %1\$s
. Або вимкнення повідомлень / попереджень приховає ці помилки.
Іншим підходом буде скасування реєстрації метабоксу, а потім перереєструйте той самий ящик з різними значеннями, називаючи текст публікації.
Дивіться обговорення, які я тут мав щодо переміщення мета-вікна, ви повинні мати можливість застосувати щось подібне до перейменування цього публікаційного тексту.