เปลี่ยนข้อความบนปุ่มเผยแพร่


21

มีวิธีในการเปลี่ยนข้อความของปุ่มเผยแพร่ในประเภทโพสต์ที่กำหนดเองเพื่อพูดแตกต่างกันบ้างไหม? ตัวอย่างเช่นบันทึกแทนการเผยแพร่ และยังลบปุ่มร่างหรือไม่

คำตอบ:


16

หากคุณมองเข้าไป/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 จะเพียงพอ

ปรับปรุง

ในการลบปุ่มบันทึกดั้งเดิม (ไม่แน่ใจว่าปุ่ม 'ฉบับร่าง' คืออะไร) ให้เพิ่มรหัสต่อไปนี้ลงใน functions.php / a plugin ของคุณ:

add_action( 'admin_print_footer_scripts', 'remove_save_button' );
function remove_save_button()
{   
?>
<script>
jQuery(document).ready(function($){$('#save-post').remove();});
</script><?php
}

ใช่มันน่าเกลียด


1
นั่นเป็นอีกเวอร์ชั่น 20 :) โค้ดสุดยอด!
Rarst

ฉันชอบมันเช่นกัน ยังคงหายไปเพื่อซ่อนปุ่มอื่น ๆ
hakre

การลบปุ่มบันทึกนั้นยากมากเพราะpost_submit_meta_box()เพียงทิ้งเนื้อหาของมันออกไป ไม่มีตัวกรองเลย Javascript หรือob_start()สามารถแก้ไขได้ ทั้งไม่หรูหรามาก
fuxia

อืมโอเคฉันได้เพิ่มรหัสเพื่อลบปุ่มบันทึกเดิม ไม่ยากอย่างนั้น :)
fuxia

ฉันพลาดคำที่จะอธิบายสิ่งนี้ :) - และพูดก่อนหน้านี้: การใช้เครื่องหมายจุลภาคเพื่อจัดรูปแบบอาร์เรย์ควรได้รับรางวัลฟอร์แมต PHP +1+
brasofilo

11

รหัสสำหรับคำแนะนำของ hakre ในการใช้ตัวกรองการแปลจะเป็นดังนี้:

add_filter( 'gettext', 'change_publish_button', 10, 2 );

function change_publish_button( $translation, $text ) {

if ( $text == 'Publish' )
    return 'Save';

return $translation;
}

มีเหตุผลหรือไม่ที่ทำให้ "รุ่น 1" (คำตอบที่ยอมรับในปัจจุบันที่เขียนโดย @toscho) มีความเหนือชั้นกว่าวิธีนี้? นี่น่าจะดีกว่าสำหรับฉันสองคน - ง่ายกว่าไม่ต้องแฮ็กเพื่อลบปุ่ม "บันทึก" และพิสูจน์ได้ในอนาคต
rinogo

คำตอบของคุณเป็นแรงบันดาลใจให้ฉัน - ฉันได้พัฒนาวิธีการของคุณเพื่อให้ครอบคลุมสายอักขระมากขึ้น wordpress.stackexchange.com/a/230513/10388
rinogo

2
ข้อเสียก็คือตัวกรองการแปลต้องใช้เวลาหลายครั้งการเชื่อมโยงเข้ากับมันเป็นค่าใช้จ่ายที่มีประสิทธิภาพอย่างมาก สิ่งนี้สามารถลดลงได้โดยการกรองเพียงระยะเวลาที่ จำกัด โดยการเพิ่ม / ลบตัวกรองใกล้กับจุดที่จำเป็นในการใช้งานจริง
Rarst

4

นี่ไม่ใช่คำตอบที่สมบูรณ์ แต่มีบางทิศทาง: ข้อความใด ๆ ที่แสดงเกินตัวกรองการแปลและสามารถเปลี่ยนได้ในฟังก์ชั่นการโทรกลับ (hook) ดังนั้นหากเบ็ดลงทะเบียนเฉพาะในหน้าเว็บที่คุณต้องการที่จะเปลี่ยนงานทำ

ปุ่มแบบร่างสามารถ "ลบออก" ได้โดยซ่อนไว้ผ่าน CSS CSS สามารถถูกฉีดเข้าไปใน<head>-tag ของผู้ดูแลระบบด้วยการติดต่อกลับ ฉันคิดว่าตัวกรองเรียกadmin_headว่า มันค่อนข้างสกปรกเมื่อปุ่มยังอยู่ที่นั่นตัวอย่างเช่นหากผู้ใช้ปิด CSS


3

เพื่อความสอดคล้องฉันสมมติว่าคุณต้องการใช้ "บันทึก" แทน "เผยแพร่" ตลอดทั้ง 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 มีทางออกที่ดี


แจ้งให้ทราบล่วงหน้า: ตัวแปรที่ไม่ได้กำหนด: s
Amjad

@Amjad - ลองเปลี่ยนทุกกรณีไป%1$s %1\$sหรือปิดการแจ้งเตือน / คำเตือนจะซ่อนข้อผิดพลาดเหล่านี้
rinogo

ฉันต้องคอยสังเกตและเตือนให้ดีบั๊ก แต่ขอบคุณสำหรับสิ่งนี้ ข้อผิดพลาดไม่แสดงอีกต่อไปโดยการเพิ่ม \
Amjad

2

วิธีการอื่นจะเป็นการยกเลิกการลงทะเบียน metabox จากนั้นลงทะเบียนกล่องเดิมใหม่ที่มีค่าต่างกันตั้งชื่อข้อความที่ประกาศ

ดูการสนทนาที่ฉันมีที่นี่เกี่ยวกับการย้ายกล่องเมตาคุณควรจะสามารถใช้สิ่งที่คล้ายกับการเปลี่ยนชื่อข้อความที่เผยแพร่


0

คุณสามารถหาปุ่มผ่าน jQuery และสลับโหนดข้อความสำหรับสิ่งอื่น นั่นคงจะเป็นเค้กชิ้นหนึ่งที่ต้องทำ


0

ทางออกที่สะอาดและง่ายกว่ามาก

function change_publish_btn_txt() {
    echo "<script type='text/javascript'>jQuery(document).ready(function(){
        jQuery('#publish').attr('value', 'Your Custom Text');
    });</script>";
}
add_action('admin_footer-post-new.php', 'change_publish_btn_txt', 99);
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.