WordPress плагин add_settings_field точный код работает в одном экземпляре, но не во втором экземпляре?

#wordpress

#wordpress

Вопрос:

Я пишу плагин, создающий страницы параметров администратора, используя комбо «register_setting», «add_settings_section», «add_settings_field». У меня есть родительское меню и 2 подменю. Создание страниц администратора в WordPress довольно просто … это начинается, когда вы создаете страницу администратора. Вот мои параметры для него. (это делается в ООП)

             'parent_slug' => 'Tee_Off', 
            'page_title' => 'Tee-Off Reports', 
            'menu_title' => 'Tee-Off Reports', 
            'capability' => 'manage_options', 
            'menu_slug' => 'tee_offs_reports', 
            'callback' => 'path to my template file goes here'; //this is correct in my code
  

итак, помните, что мой список меню «tee_offs_reports», опубликованный выше, необходим для следующего шага…

     class ClubHouseReports
{
    function register()
    {
        add_action( 'admin_init', array( $this, 'teeoff_report_sellector') );
        
    }
    
    function teeoff_report_sellector() {
        register_setting( 'my_options_group', 'timer_month' );
        register_setting( 'my_options_group', 'timer_day' );
        register_setting( 'my_options_group', 'timer_year' );
        
        add_settings_section( 'teeoff-club-options', 'Get Monthy Report', array( $this,     'teeoff_month_section'), 'tee_offs_reports');
        
        add_settings_field( 'timer_month', 'Month', array( $this, 'teeoff_month'), 'tee_offs_reports', 'teeoff-club-options');
        add_settings_field( 'timer_day', 'Day', array( $this, 'teeoff_day'), 'tee_offs_reports', 'teeoff-club-options');
        add_settings_field( 'timer_year', 'Year', array( $this, 'teeoff_year'), 'tee_offs_reports', 'teeoff-club-options');
        
    }
    function teeoff_month_section() {
        echo '<p>Reports</p>';
                
    }

    function teeoff_month() {
        $timer_month = esc_attr( get_option( 'timer_month' ) );
        echo '<input type="text" class="regular-text" name="timer_month" value="'.$timer_month.'" placeholder="Month" />';      
    }
    function teeoff_day() {
        $timer_day = esc_attr( get_option( 'timer_day' ) );
        echo '<input type="text" class="regular-text" name="timer_day" value="'.$timer_day.'" placeholder="Day" />';        
    }
    function teeoff_year() {
        $timer_year = esc_attr( get_option( 'timer_year' ) );
        echo '<input type="text" class="regular-text" name="timer_month" value="'.$timer_year.'" placeholder="Year" />';        
    }
    }
  

Этот класс выше вызывается из корневого файла плагина, точно так же, как тот, который работает. Создается экземпляр, после чего вызывается метод «register()».

В моем файле шаблона я делаю это…. точно так же, как тот, который работает.

     <?php settings_errors(); ?>

<form method="post" action="options.php">
    <?php settings_fields( 'my_options_group' ); ?>
    <?php do_settings_sections('teeoff-club-options'); ?>
    <?php submit_button(); ?>
</form>
  

ИТАК, моя проблема в том, что … за исключением случаев, когда значения должны меняться при повторении одного и того же кода, в данном случае, например, вам нужно назначить новый модуль меню, новое имя для «register_setting» и убедиться, что он нацелен на правильный обратный вызов, и, уверяю вас, все правильноустановите правильно … по какой-то причине это не будет отображаться.

Я не получаю ошибок, все, что я вижу, это кнопка отправки, и если я использую ее, я получаю сообщение «успех», так что все в рамках… но на странице «tee_offs_reports» ничего не отображается, кроме кнопки отправки… что имеет смысл, поскольку оно там жестко запрограммировано.

Все это, чтобы сказать… Я десятки раз просматривал свой код, чтобы найти самую маленькую / глупую синтаксическую ошибку или что-нибудь, почему эта область администрирования не будет работать, в то время как другая, которая использует точно такую же структуру и логику, работает на 100%. Вы видите что-то неправильное в этом коде? Не обращайте внимания на большой пробел между приведенным выше кодом, это произошло только тогда, когда я вставил его сюда…. Есть ли ограничение в WordPress, о котором я еще не знаю? Почему это не работает? Хотя синяя печать этого работает просто отлично.

Ответ №1:

Хорошо, теперь я действительно сбит с толку… Я заставил его работать, но я очень сомневаюсь, что следую правилам кодекса… или я?????

вот код, который работает на 100%

 function teeoff_report_sellector() {
        register_setting( 'my_options_group', 'timer_month' );
        register_setting( 'my_options_group', 'timer_day' );
        register_setting( 'my_options_group', 'timer_year' );
        
        add_settings_section('tee-off-reports', 'Get Monthy Report', array( $this, 'teeoff_month_section'), 'tee-off-reports');
        
        add_settings_field('timer_month', 'Month', array( $this, 'teeoff_month'), 'tee-off-reports', 'tee-off-reports');
        add_settings_field('timer_day', 'Day', array( $this, 'teeoff_day'), 'tee-off-reports', 'tee-off-reports');
        add_settings_field('timer_year', 'Year', array( $this, 'teeoff_year'), 'tee-off-reports', 'tee-off-reports');
        
    }
    function teeoff_month_section() {
        echo '<p>Reports</p>';
                
    }

    function teeoff_month() {
        $timer_month = esc_attr( get_option( 'timer_month' ) );
        echo '<input type="date" class="regular-text" name="timer_month" value="'.$timer_month.'" placeholder="Month" />';      
    }
    function teeoff_day() {
        $timer_day = esc_attr( get_option( 'timer_day' ) );
        echo '<input type="text" class="regular-text" name="timer_day" value="'.$timer_day.'" placeholder="Day" />';        
    }
    function teeoff_year() {
        $timer_year = esc_attr( get_option( 'timer_year' ) );
        echo '<input type="text" class="regular-text" name="timer_year" value="'.$timer_year.'" placeholder="Year" />';     
    }
  

То, что я сделал, это … вместо того, чтобы использовать меню, как говорит вам кодекс, …(и первая страница администратора, которую я создал, хорошо работает таким образом) Я заменил его идентификатором «add_settings_section» … поэтому, если вы посмотрите на предпоследний параметр для каждого «add_settings_field», теперь им присваивается идентификатор раздела, предполагается, что codex ищет меню… Я всегда так думал… опять же, первый, который я сделал, работает потрясающе таким образом … так что 2 последних параметра «add_settings_field» одинаковы. Странно! Нигде в приведенном выше коде не упоминается страница slug, но это работает на 100% и не нарушает какой-либо другой код.

Теперь мне интересно… я нашел ошибку в API настроек? это будет исправлено позже, и мой плагин перестанет работать? Или я наткнулся на решение, отчаявшись попробовать целую кучу вещей???

Я не понимаю … если есть настоящий гуру WordPress, который может мне это объяснить, я был бы очень признателен!