daveromsey
  • 0
Учитель

Как предотвратить удаление текста, измененного с помощью фильтра gettext (предположительно) js-функцией updateText() на экране редактирования CPT

  • 0

Сначала небольшая предыстория… У меня есть пользовательский тип сообщений, в котором я хотел бы использовать настраиваемые статусы сообщений. Поскольку настраиваемые статусы сообщений (stati/status/независимо) не были полностью реализованы в ядре, я решил использовать фильтры gettetext для изменения названий определенных вещей. Например, я изменил текст «Опубликовать» на кнопке публикации на «Сохранить». Я пошел с чем-то вроде подхода Рарста здесь. Краткое изложение моего кода ниже. Я действительно не собираюсь делать ничего радикального здесь, поскольку меняю то, что делает/является каждым статусом.

В любом случае, перевод отлично работает в том, что касается PHP. Однако во время тестирования я понял, что если я щелкну ссылку «Изменить» в разделе «Разное действия публикации», а затем щелкну ссылку «Отмена», которая появится впоследствии, моя переведенная кнопка «Сохранить» вернется к кнопке «Опубликовать».

Похоже, это происходит из-за функции javascript, updateText() найденной в/wp-admin/js/post.dev.js . Я ищу способ, чтобы JS не топтал мой перевод. Я бы предпочел не возиться с этим, используя манипуляции с DOM, но если это мой единственный вариант, я пойду на это. У меня 3.1, кстати.

<?php
class MyClass {

        function __contsruct() {
            add_action( 'admin_head', array ( &$this, 'load_gettext_filters' ) );
        }

        function load_gettext_filters() {
            add_filter( 'gettext', array ( &$this, 'change_publishing_text' ), 10, 2 );
        }

        function change_publishing_text( $translation, $text ) {
            global $post;

            if ( ! isset ( $post->post_type ) ) {
                return $translation;
            }

            if ( 'mypost' === $post->post_type ) {
                if ( ( 'Publish' === $text ) ) {
                    return 'Save';
                }
            }
            return $translation;
        }

    }
Share
  1. Во-первых, у вас неприятная опечатка в __contsruct . 🙂

    Во-вторых, у вас неверный тайминг хука. Связанный WP JavaScript локализуется через postL10n объект (вы можете видеть его повторение в исходном коде страницы), который собирается на init крючке — намного раньше, чем тогда, admin_head и ваш фильтр еще не на месте.

    Из быстрого теста это должно сделать это:

    add_action( 'init', array ( &$this, 'load_gettext_filters' ), 9 );
    

    Обновлять

    Хорошо, сотрите это. Не сработает, если нам нужен контекст. Давайте попробуем это:

    add_action('admin_footer', array ( &$this, 'localize_post_script' ) );
    
        function localize_post_script() {
    
            global $wp_scripts;
    
            $wp_scripts->registered['post']->extra['l10n'][1]['publish'] = __('Publish');
        }
    
    • 0
  2. У вас обоих есть правильная идея, но на самом деле вам понадобятся оба фильтра: один для улавливания текста кнопки, другой для улавливания локализованного текста, то есть их комбинация.

    Это работает..

    class MyClass {
        function __construct() {
            add_action('admin_head-post.php',     array ( $this, 'load_gettext_filters' ), 1 );
            add_action('admin_head-post-new.php', array ( $this, 'load_gettext_filters' ), 1 );
        }
    
        function load_gettext_filters() {
            global $post_type, $wp_scripts;
    
            if( 'YOURTYPENAMEHERE' != $post_type )
                return;
    
            $wp_scripts->registered['post']->extra['l10n'][1]['publish'] = __('Save');
    
            add_filter( 'gettext', array ( $this, 'change_publishing_text' ), 10, 2 );
        }
    
        function change_publishing_text( $translation, $text ) {
            if( 'Publish' != $text )
                return $translation;
    
            return __( 'Save' );
        }
    }
    $MyClass = new MyClass;
    
    • 0

Оставить ответ

You must login to add an answer.