Я добавил поле в функцию «Быстрое редактирование» в WordPress. Это работает, и я могу обновить базу данных. Однако у меня много проблем с выяснением того, как установить начальное значение меню выбора. По умолчанию всегда используется значение «Открыть», несмотря на использование jQuery, чтобы попытаться обновить значение селектора до желаемого значения. Вот соответствующий код, который я собрал из других примеров:

function quick_edit_javascript() {
    global $current_screen;

    if ( 'grievance' != $current_screen->post_type ) {
        return;
    }
?>
    <script type="text/javascript">
    function value_step( fieldValue ) {
        inlineEditPost.revert();

        // This is the broken part
        jQuery('select[name="step"]').val(fieldValue).change();

        // This gets triggered, so I know code is getting executed:
        alert('hi');
    }
    </script>
<?php
}
add_action( 'admin_footer', 'quick_edit_javascript' );


/**
 * Pass step value to value_step javascript function
 *
 * @param array $actions
 * @param array $post
 *
 * @return array
 */
function expand_quick_edit_link( $actions, $post ) {
    global $current_screen;

    if ( 'grievance' != $current_screen->post_type ) {
        return $actions;
    }
    $meta = get_post_meta( $post->ID, 'my_first_plugin_fields', true);
    $data = $meta['step'];

    $actions['inline hide-if-no-js']    = '<a href="#" class="editinline" title="';
    $actions['inline hide-if-no-js']    .= esc_attr( 'Edit this item inline' ) . '"';
    $actions['inline hide-if-no-js']    .= " onclick=\"value_step('{$data}')\" >";
    $actions['inline hide-if-no-js']    .= 'Quick Edit';
    $actions['inline hide-if-no-js']    .= '</a>';

    return $actions;
}
add_filter( 'post_row_actions', 'expand_quick_edit_link', 10, 2 );

Я пробовал много разных методов jQuery, но ничего из того, что я делаю, не обновляет значение меню выбора. Как ни странно, это работает:

jQuery('select[name="step"]').hide();

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

jQuery('select[name="step"]').val(2).change();

А также

jQuery('select[name="step"]').val('2').change();

Но это не сработало. Я не уверен, что еще попробовать. HTML для поля select выглядит следующим образом:

<div class="inline-edit-col">
    <select name="step"><option value="1">Open</option><option value="2">Closed</option></select>
  </div>
0
StevieD 29 Окт 2019 в 22:29
Если вы зарегистрируете fieldValue в консоли, используя console.log(fieldValue), вы получите значение?
 – 
Amós Assis
29 Окт 2019 в 22:54
Сразу после изменения значения я сделал: alert(jQuery('select[name="step"]').children("option:selected").val()); и возвращает правильное значение «2». Таким образом, он меняет его, но это изменение не отражается в HTML. Я думаю, что каким-то образом значение снова меняется. Я не знаю, как и где.
 – 
StevieD
29 Окт 2019 в 23:00
Я попытался уменьшить приоритет вызова add_filter('post_row_actions' ...), но это не помогло.
 – 
StevieD
29 Окт 2019 в 23:02
Просто для теста поместите этот код в свой javascript jQuery('select[name="step"]').change(function (e) { console.log('changed', e.target.value, 'at', e.timeStamp); });, который регистрирует каждое изменение в компоненте
 – 
Amós Assis
29 Окт 2019 в 23:17
Он показывает только одно изменение: changed – "2" – "at" – 1572381354595
 – 
StevieD
29 Окт 2019 в 23:36

1 ответ

Под капотом происходит какое-то вуду, которое я затрудняюсь объяснить. Это работает (обратите внимание, что класс .inline-edit-col был добавлен в селектор jquery, но это не то, что делает эту работу):

function quick_edit_javascript() {
    global $current_screen;

    if ( 'grievance' != $current_screen->post_type ) {
        return;
    }
?>
    <script type="text/javascript">
    function value_step( fieldValue ) {
        inlineEditPost.revert();
        var checkExist = setInterval(function() {
          alert('check exist');
          if (jQuery('.inline-edit-col select[name="step"]').length) {
                jQuery('.inline-edit-col select[name="step"]').val(2).change();
              clearInterval(checkExist);
          }
        }, 100);
        jQuery('.inline-edit-col select[name="step"]').val('2').change();
        alert('hi');
        alert(jQuery('.inline-edit-col select[name="step"]').children("option:selected").val());
    }
    </script>
<?php
}
add_action( 'admin_footer', 'quick_edit_javascript' );

Чего я действительно не понимаю, так это того, что отображается alert('hi') и предупреждение, следующее за тем, которое выводит значение поля, а ТОГДА появляется предупреждение alert('check exist'). Может быть, кто-то более знакомый с javascript может помочь объяснить, что происходит.

0
StevieD 30 Окт 2019 в 00:27