Я добавил поле в функцию «Быстрое редактирование» в 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>
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 может помочь объяснить, что происходит.
Похожие вопросы
Новые вопросы
jquery
jQuery — это библиотека JavaScript. Также рассмотрите возможность добавления тега JavaScript. jQuery — это популярная кросс-браузерная библиотека JavaScript, которая упрощает обход объектной модели документа (DOM), обработку событий, анимацию и взаимодействие AJAX, сводя к минимуму расхождения между браузерами. Вопрос с тегом jQuery должен быть связан с jQuery, поэтому jQuery должен использоваться рассматриваемым кодом, и в вопросе должны быть как минимум элементы, связанные с использованием jQuery.
console.log(fieldValue)
, вы получите значение?alert(jQuery('select[name="step"]').children("option:selected").val());
и возвращает правильное значение «2». Таким образом, он меняет его, но это изменение не отражается в HTML. Я думаю, что каким-то образом значение снова меняется. Я не знаю, как и где.add_filter('post_row_actions' ...)
, но это не помогло.jQuery('select[name="step"]').change(function (e) { console.log('changed', e.target.value, 'at', e.timeStamp); });
, который регистрирует каждое изменение в компонентеchanged – "2" – "at" – 1572381354595