Intereting Posts
Pull 'Популярные сообщения' в течение определенного периода времени Скрыть «Настройки галереи» и «Вставить в сообщение» из окна «Вложение» WordPress с php 5.5 и zend opcache В детской теме mo и po не работает При переключении с html на визуальный редактор тег <iframe> повреждается WordPress – Портфолио – изменение количества элементов в строке Лучший подход для загрузки боковой панели Только в том случае, если максимальная ширина экрана составляет> 900 пикселей? Для каждого +1 WordPress Loop Как отключить WordPress от перегрузки стилей стилей с помощью стилей настройки Как заставить редактор сообщений и медиабиблиотеку уважать режим администрирования HTTPS? Поиск способа загрузки функции после завершения предварительного просмотра предварительного просмотра Как заказать тип сообщения с meta_value_num и если meta_value_num не существует, то порядок по дате Как добавить поле списка в поле мета-поля? плагин для публикации сообщения в социальных сетях через администратора? Класс не поддерживает Ajax

Как настроить набор полей плагина?

Проблема / Общие сведения

В настоящее время я создаю плагин для клиента, который позволит им отмечать и изменять предопределенные полигоны Google Map (отображаются на сайте) на панели управления.

Я хочу, чтобы пользователь отмечал многоугольник как важный, устанавливал пользовательский цвет, непрозрачность и текст информационного окна – все, что я смог сделать до сих пор. Проблема в том, что эти наборы полей должны существовать для всех 180-ичных многоугольников. С помощью API настроек WP я могу создавать и сохранять поля, но было бы смешно создавать 500+ обратных вызовов для каждого конкретного поля. Поэтому в течение последних нескольких дней я пытался прокрутить поле, задав определенное количество раз и добавив переменное число.

Текущий код

Вот текущая регистрация поля опций для одного набора полигонов (как хранится в классе):

<?php public function page_init() { //[. . . ] add_settings_section( 'rangers_txs', 'Texas Senate District Options', array($this, 'print_txs_info'), 'rangers_txs_option' ); register_setting( 'rangers_txs', 'rangers_txs_option', array($this, 'ranger_txs_sanitize') ); $i=1; while($i <= 31) { add_settings_field( 'rangers_txs_checkbox_'.$i, //id 'Is District '.$i.' important?', //Title array( $this, 'rangers_txs_check_callback_'.$i), //callback 'rangers_txs_option', //page 'rangers_txs', //section array('field' => 'txs_checkbox') ); add_settings_field( 'rangers_txs_colorpicker_'.$i, //id 'District Color', //Title array( $this, 'rangers_txs_color_callback_'.$i ), //callback 'rangers_txs_option', //page 'rangers_txs', //section array('field' => 'txs_colorpicker') ); add_settings_field( 'rangers_txs_opacity_'.$i, //id 'How important is it?', //Title array( $this, 'rangers_txs_opacity_callback_'.$i ), //callback //array($this, 'rangers_txs_input_array'), //'rangers_txs_opacity_callback_'.$i, //callback 'rangers_txs_option', //page 'rangers_txs', //section array('field' => 'txs_opacity') ); add_settings_field( 'rangers_txs_info_'.$i, //id 'District Information', //Title array( $this, 'rangers_txs_info_callback_'.$i ), //callback 'rangers_txs_option', //page 'rangers_txs', //section array('field' => 'txs_info') ); $i++; } } ?> 

И вот один набор обратных вызовов, которые я тестировал и работал правильно:

 <?php public function colorpicker_init() { echo '<script type="text/javascript"> jQuery(document).ready(function($) { $(".tr-color-picker").wpColorPicker(); }); </script>'; } public function rangers_txs_check_callback_1() { printf( '<input type="checkbox" id="rangers_txs_checkbox_1" name="rangers_txs_option[rangers_txs_checkbox_1]" %1$s /> <label for="rangers_txs_option[rangers_txs_checkbox_1]">Yep, it\'s important.', checked( isset($this->txsoptions['rangers_txs_checkbox_1']), true, false) ); } public function rangers_txs_color_callback_1() { $this->colorpicker_init(); $color = $this->txsoptions['rangers_txs_colorpicker_1'] != '' ? sanitize_text_field($this->txsoptions['rangers_txs_colorpicker_1']) : '#0A64A4'; printf( '<input type="text" name="rangers_txs_option[%1$s]" id="%1$s" class="tr-color-picker" data-default-color="#0A64A4" value="'.$color.'" />', 'rangers_txs_colorpicker_1' ); } public function rangers_txs_opacity_callback_1() { print '<p><em>On a scale of 1-10 (determines opacity of district, default: 5).</em></p>'; printf( '<input type="text" id="rangers_txs_opacity_1" name="rangers_txs_option[rangers_txs_opacity_1]" value="%s" />', isset( $this->txsoptions['rangers_txs_opacity_1'] ) ? esc_attr( $this->txsoptions['rangers_txs_opacity_1']) : '' ); } public function rangers_txs_info_callback_1() { isset($this->txsoptions['rangers_txs_info_1']) ? $content = $this->txsoptions['rangers_txs_info_1'] : $content = ''; echo '<textarea id="rangers_txs_info_1" name="rangers_txs_option[rangers_txs_info_1]" rows="6" cols="50">'.$content.'</textarea>'; } ?> 

Вопрос

Как вы можете видеть, у меня есть флажок, выбор цвета, ввод непрозрачности и текстовая область. Я хочу, чтобы весь набор был зациклен для каждого многоугольника. Я попытался запустить поля в одном обратном вызове, но он просто объединил все одинаковые параметры (т. Е. 31 флажок, затем 31 выбор цвета и т. Д.). Я также попытался установить обратные вызовы вне класса и время цикла вокруг набора функций, но используя переменную $i в возвращаемых ошибках имени функции, как и добавлял ее перед вызовом и при вызове функций.

Я был бы очень признателен за любые предложения, которые могли бы помочь мне достичь результата циклов полей цикла.

Я понял это после небольшой работы.

Для начала я array($this, 'txs_loop_callbacks') использовать один обратный вызов: array($this, 'txs_loop_callbacks') используя add_settings_field выше регистрацию add_settings_field . Затем я изменил окончательный аргумент в редакции поля, сделав каждый из них уникальным для этого конкретного поля: array('field' => 'txs_opacity_'.$i) .

Затем в обратном вызове цикла я хранил HTML каждого поля в анонимной функции, определенной как переменная. Вот так:

 $txs_checkbox = function($num) { $is_checked = checked( isset($this->txsoptions['rangers_txs_checkbox_'.$num]), true, false); printf( '<input type="checkbox" class="is-important-'.$num.'" id="rangers_txs_checkbox_'.$i.'" name="rangers_txs_option[rangers_txs_checkbox_'.$num.']" %1$s /> <label for="rangers_txs_option[rangers_txs_checkbox_'.$num.']">District '.$num.' is important</label><br /><br />', $is_checked ); }; 

Я определил этот тип переменной для каждого типа поля (т. $txs_checkbox , $txs_colorpicker и on).

После этого я вызывал анонимные функции внутри цикла с проверкой, чтобы отображать только один вид поля для каждого набора.

 $n=1; while($n <= 31) { switch($args['field']): case('txs_checkbox_'.$n): $txs_checkbox($n); break; case('txs_colorpicker_'.$n): $txs_colorpicker($n); break; case('txs_opacity_'.$n): $txs_opacity($n); break; case('txs_info_'.$n): $txs_info($n); break; endswitch; $n++; } 

С этими элементами все вместе я смог добиться результата повторных наборов полей.