Форум программистов, компьютерный форум, киберфорум
WordPress
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.71/7: Рейтинг темы: голосов - 7, средняя оценка - 4.71
Супер-модератор
Эксперт JSЭксперт HTML/CSSЭксперт PHP
 Аватар для gogolik
3961 / 2079 / 832
Регистрация: 13.03.2010
Сообщений: 6,851

Обновить мета-поле из фронта

19.09.2018, 16:55. Показов 1539. Ответов 8
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Есть код, отвечающий за вывод постов через ajax после поиска. Хочу сделать так, чтобы при клике кнопки "Регистрация" в мета-поле "field_id" записывалось значение "yes". Мои попытки не увенчались успехом. Что я делаю не так?
PHP/HTML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
<?php function data_fetch(){
    $the_query = new WP_Query( array(
        'posts_per_page' => 20,
        's' => esc_attr($_POST['keyword']),
        'post_type' => 'clients',
        'orderby' => 'name',
        'order' => 'ASC',
        'sentence' => 1,
    ) );
    if( $the_query->have_posts() ) :
        while( $the_query->have_posts() ): $the_query->the_post();
            global $post;
            $client_tickets = get_post_meta($post->ID, 'tickets', true);
            $client_people = get_post_meta($post->ID, 'people', true);
            $client_phone = get_post_meta($post->ID, 'phone', true);
            $client_reg = get_post_meta($post->ID, 'field_id', true);
            if($_POST['reg'] == 'yes') {
                update_post_meta($post->ID, 'field_id', 'yes');
            }  ?>
            <tr <?php post_class(); ?>>
                <td><?php the_title(); ?></td>
                <td><?php echo $client_tickets; ?></td>
                <td><?php echo $client_people; ?></td>
                <td><?php echo $client_phone; ?></td>
                <td> <?php if($client_reg == "yes") { ?>
                    <button class="button success" disabled>Регистрация</button>
                <?php } else { ?>
                    <form method="post" action=""><input type="hidden" name="reg" id="reg" value="yes"><button class="button success" type="submit" value="save">Регистрация</button></form>
                <?php } ?>
                </td>
              </tr>
        <?php endwhile;
        wp_reset_postdata();
    endif;
    die();
}
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
19.09.2018, 16:55
Ответы с готовыми решениями:

Автоматически обновить поле в форме при добавлении нового значения в поле со списком
помогите плииииз, у меня форма в ней поля: код(счетчик); фамилия(текст); профессия(подстановка из таблицы &quot;профессия&quot;);...

Как записать данные (мета поле) извне?
Можно ли как то записывать метаполя извне сформировав специальный url что то типа такого...

Обновить поле
Подскажите как при сохранении данных в одной таблице обновить данные в поле связанной таблице.

8
 Аватар для HectorPrima
716 / 473 / 258
Регистрация: 19.12.2014
Сообщений: 1,801
20.09.2018, 01:57
После нажатия на форму перегружается текущая страница и до вашего кода update_post_meta дело не доходит.
Этот ваш код срабатывает скорее всего при подгрузке по Ajax и в тот момент конечно же массив $_POST без данных.
Переделайте реакцию на кнопку "Регистрация" так же, на Ajax и все.
Ну и стоит использовать wp_nonce_field() или check_ajax_referer() для Ajax
1
Супер-модератор
Эксперт JSЭксперт HTML/CSSЭксперт PHP
 Аватар для gogolik
3961 / 2079 / 832
Регистрация: 13.03.2010
Сообщений: 6,851
20.09.2018, 08:30  [ТС]
HectorPrima, спасибо за ответ, попробую. Но в целом-то было бы лучше, чтобы при клике страница перезагружалась.
Про безопасность особо можно и не думать, страница будет в локальном доступе на 1 вечер для регистрации прибывших на мероприятие людей.
0
 Аватар для HectorPrima
716 / 473 / 258
Регистрация: 19.12.2014
Сообщений: 1,801
20.09.2018, 08:50
Цитата Сообщение от gogolik Посмотреть сообщение
чтобы при клике страница перезагружалась
Ну так у вас при клике страница и должна перегружаться. Другой вопрос что у вас при загрузке страницы (не через Ajax) скорее всего не выполняется data_fetch. Вы же его выполняете при запросе через Ajax, правильно?

Добавлено через 59 секунд
Я к тому что в таком виде, ваш код прекрасно работает и прописывает yes куда вы хотели.
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
<?php
/*
 * Template Name: Form with write data testing
 */
?>
 
<?php get_header(); ?>
 
<?php function data_fetch(){
    $the_query = new WP_Query( array(
        'posts_per_page' => 20,
        's' => esc_attr($_POST['keyword']),
        'post_type' => 'clients',
        'orderby' => 'name',
        'order' => 'ASC',
        'sentence' => 1,
    ) );
    if( $the_query->have_posts() ) :
        while( $the_query->have_posts() ): $the_query->the_post();
            global $post;
            $client_tickets = get_post_meta($post->ID, 'tickets', true);
            $client_people = get_post_meta($post->ID, 'people', true);
            $client_phone = get_post_meta($post->ID, 'phone', true);
            $client_reg = get_post_meta($post->ID, 'field_id', true);
            if($_POST['reg'] == 'yes') {
                update_post_meta($post->ID, 'field_id', 'yes');
            }  ?>
            <tr <?php post_class(); ?>>
                <td><?php the_title(); ?></td>
                <td><?php echo $client_tickets; ?></td>
                <td><?php echo $client_people; ?></td>
                <td><?php echo $client_phone; ?></td>
                <td> <?php if($client_reg == "yes") { ?>
                        <button class="button success" disabled>Регистрация</button>
                    <?php } else { ?>
                        <form method="post" action=""><input type="hidden" name="reg" id="reg" value="yes"><button class="button success" type="submit" value="save">Регистрация</button></form>
                    <?php } ?>
                </td>
            </tr>
        <?php endwhile;
        wp_reset_postdata();
    endif;
    die();
}
?>
 
<?php data_fetch(); ?>
 
<?php get_footer(); ?>
1
Супер-модератор
Эксперт JSЭксперт HTML/CSSЭксперт PHP
 Аватар для gogolik
3961 / 2079 / 832
Регистрация: 13.03.2010
Сообщений: 6,851
20.09.2018, 09:16  [ТС]
HectorPrima, ну, вообще, изначально страница имеет вид:

После ввода запроса в поле выполняется поиск и через ajax этой функцией data_fetch выводятся подходящие записи:

Если на странице больше 1 записи, то при нажатии "регистрация" метаполе обновляется у всех видимых на экране (по вашему коду). В моём коде вообще ничего не происходит, кроме перезагрузки страницы.
0
 Аватар для HectorPrima
716 / 473 / 258
Регистрация: 19.12.2014
Сообщений: 1,801
20.09.2018, 09:45
Ну да, туплю. Вам просто в форме нужно вставить ID поста. А потом проверять его. Как то так:
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
<?php
/*
 * Template Name: Form with write data testing
 */
?>
 
<?php get_header(); ?>
 
<?php function data_fetch(){
    $the_query = new WP_Query( array(
        'posts_per_page' => 20,
        's' => esc_attr($_POST['keyword']),
        'post_type' => 'clients',
        'orderby' => 'name',
        'order' => 'ASC',
        'sentence' => 1,
    ) );
    if( $the_query->have_posts() ) :
        while( $the_query->have_posts() ): $the_query->the_post();
            global $post;
            $client_tickets = get_post_meta($post->ID, 'tickets', true);
            $client_people = get_post_meta($post->ID, 'people', true);
            $client_phone = get_post_meta($post->ID, 'phone', true);
            $client_reg = get_post_meta($post->ID, 'field_id', true);
            if($_POST['reg'] == 'yes' && $_POST['mypostid'] > 0) {
                update_post_meta((int)$_POST['mypostid'], 'field_id', 'yes');
            }  ?>
            <tr <?php post_class(); ?>>
                <td><?php the_title(); ?></td>
                <td><?php echo $client_tickets; ?></td>
                <td><?php echo $client_people; ?></td>
                <td><?php echo $client_phone; ?></td>
                <td> <?php if($client_reg == "yes") { ?>
                        <button class="button success" disabled>Регистрация</button>
                    <?php } else { ?>
                        <form method="post" action=""><input type="hidden" name="mypostid" value="<?php echo $post->ID; ?>"><input type="hidden" name="reg" id="reg" value="yes"><button class="button success" type="submit" value="save">Регистрация</button></form>
                    <?php } ?>
                </td>
            </tr>
        <?php endwhile;
        wp_reset_postdata();
    endif;
    die();
}
?>
 
<?php data_fetch(); ?>
 
<?php get_footer(); ?>
Добавлено через 2 минуты
Но это все немного кривовато.
После POST или GET запроса по хорошему редирект нужно делать на оригинальную страницу.
Потому как в обычном случае при нажатии F5 повторно выполняется предыдущий запрос.
1
Супер-модератор
Эксперт JSЭксперт HTML/CSSЭксперт PHP
 Аватар для gogolik
3961 / 2079 / 832
Регистрация: 13.03.2010
Сообщений: 6,851
20.09.2018, 10:04  [ТС]
HectorPrima, спасибо за ответы, в вашем варианте всё более-менее работает, но в моём - нет. Ничего не понимаю)
Полный код в functions.php:
PHP/HTML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
add_action( 'wp_footer', 'ajax_fetch' );
function ajax_fetch() { ?>
<script type="text/javascript">
function fetch(){
    if (jQuery('#keyword').val().length > 2) {
    jQuery.ajax({
        url: '<?php echo admin_url('admin-ajax.php'); ?>',
        type: 'post',
        data: { action: 'data_fetch', keyword: jQuery('#keyword').val() },
        success: function(data) {
            jQuery('#datafetch').html( data );
        }
    });
    }
}
</script>
<?php }
add_action('wp_ajax_data_fetch' , 'data_fetch');
add_action('wp_ajax_nopriv_data_fetch','data_fetch');
function data_fetch() {
    $the_query = new WP_Query( array(
        'posts_per_page' => 20,
        's' => esc_attr($_POST['keyword']),
        'post_type' => 'clients',
        'orderby' => 'name',
        'order' => 'ASC',
        'sentence' => 1,
    ) );
    if( $the_query->have_posts() ) :
        while( $the_query->have_posts() ): $the_query->the_post();
            global $post;
            $client_tickets = get_post_meta($post->ID, 'tickets', true);
            $client_people = get_post_meta($post->ID, 'people', true);
            $client_phone = get_post_meta($post->ID, 'phone', true);
            $client_reg = get_post_meta($post->ID, 'field_id', true);
            if($_POST['reg'] == 'yes' && $_POST['mypostid'] > 0) {
                update_post_meta((int)$_POST['mypostid'], 'field_id', 'yes');
            }  ?>
            <tr <?php post_class(); ?>>
                <td><?php the_title(); ?></td>
                <td><?php echo $client_tickets; ?></td>
                <td><?php echo $client_people; ?></td>
                <td><?php echo $client_phone; ?></td>
                <td> <?php if($client_reg == "yes") { ?>
                        <button class="button success" disabled>Регистрация</button>
                    <?php } else { ?>
                        <form method="post" action=""><input type="hidden" name="mypostid" value="<?php echo $post->ID; ?>"><input type="hidden" name="reg" id="reg" value="yes"><button class="button success" type="submit" value="save">Регистрация</button></form>
                    <?php } ?>
                </td>
            </tr>
        <?php endwhile;
        wp_reset_postdata();
    endif;
    die();
}
index.php:
PHP/HTML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
 <input type="text" placeholder="Введите имя участника" name="keyword" id="keyword" onkeyup="fetch()"></input>
      <table>
        <thead>
            <tr>
              <th>Имя участника</th>
              <th>Билеты</th>
              <th>Доверенные лица</th>
              <th>Телефон</th>
              <th>Действия</th>
            </tr>
          </thead>
          <tbody id="datafetch">
          </tbody>
      </table>
0
 Аватар для HectorPrima
716 / 473 / 258
Регистрация: 19.12.2014
Сообщений: 1,801
20.09.2018, 10:24
Лучший ответ Сообщение было отмечено gogolik как решение

Решение

Вы плохо читали то что я написал. Сами посмотрите в свой код. При клике на кнопку по сути просто перегружается страница.
Далее в коде может быть проверка переменной $_POST и обработка данных. Но у вас то $_POST обрабатывается в Ajax запросе, что бессмысленно в данном случае. Я и предлагал вам сделать обработку кнопки через Ajax.
Т.е. как все должно работать, есть к примеру кнопки:
HTML5
1
2
3
<button class="mybutton" data-post-id="1">Регистрация</button>
<button class="mybutton" data-post-id="2">Регистрация</button>
<button class="mybutton" data-post-id="3">Регистрация</button>
На класс mybutton вешается обработчик. Он берет номер поста из кастомного атрибута data-post-id и передает Ajax запросом вордпрессу. Вордпресс в своем php обработчике вашего запроса берет пост и добавляет к нему метатег. Далее если все сработало, обработчик возвращает результат. К примеру true.
Вы в Ajax получая true в результате Ajax запроса берете и дизаблите кнопку через
JavaScript
1
$(id кнопки).prop('disabled', true);
0
Супер-модератор
Эксперт JSЭксперт HTML/CSSЭксперт PHP
 Аватар для gogolik
3961 / 2079 / 832
Регистрация: 13.03.2010
Сообщений: 6,851
20.09.2018, 10:48  [ТС]
HectorPrima, туплю. Сделал, спасибо.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
20.09.2018, 10:48
Помогаю со студенческими работами здесь

Обновить поле со списком
Добрый день! Подскажите как решить проблему... Есть база данных, в ней форма... Не получается организовать так чтоб на основе...

Обновить дочернее поле
Привет! Пожалуйста, опытные гуру php+mysql помогите лютому нубу с огнём в глазах разобраться в сей задачке. Постараюсь кратко. Как...

Не возможно обновить поле
Форумчане, доброго времени суток! Интерфейс Аксесс-2003, БД на MySQL Возникла следующая проблема: при вводе данных в поле формы...

Поле список обновить по событию
Есть форма вводим новую строку склад - 1 фио - 21, группа - 1, номенклатурный номер - 111-1111. После ввода должно обновиться поле список...

Как обновить поле с TIMESTAMP?
Добрый день. В таблице есть три колонки: id, UserId, Time. id и UserId - составной ключ, а Time имеет тип TIMESTAMP и по умолчанию...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Новые блоги и статьи
Символьное дифференцирование
igorrr37 13.02.2026
/ * Программа принимает математическое выражение в виде строки и выдаёт его производную в виде строки и вычисляет значение производной при заданном х Логарифм записывается как: (x-2)log(x^2+2) -. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru