Как я работаю с Алисой от Яндекса #1

Покурим неспеша
Статья о том, почему нельзя доверять ии что-то серьезное. И краткий пересказ от Alice AI под верхней картинкой справа ))

Galaxy King в нетрезвом виде #1

Хочу на сайте galaxyking.ru дополнить статьй опросами…

То есть нужно брать данные о городе из плагина mi13-city-user-location который мы с тобой разрабатывали как то. Ждать хотя бы 10 голосов для страны. И в теле поста выводить опрос и данные по странам.

Например..

Россия:

Самодержавие 15%
Демократия 16%
Galaxy King 60%
Затрудняюсь 9%

Проголосовали 16 городов.

Голос уходит в ajax и фиксируется ip `адресом и куки. При голосовании удаляем кэш записи..

$file = glob(MI13_CACHE_DIR . $post->post_name . '.html');
$result = wp_delete_file($file);

В тело поста опрос внедряется обычным текстом который я обернул в div id=»poll»

ul li внутри такого блока варианты ответов. Количество ответов для каждого варианта хранятся в произвольных полях поста.

Количество голосов подгружается на хуке the_content например.

Код в functions.php темы

Алиса #1

Ниже — реализация вашего сценария в виде кода для functions.php темы WordPress. Код учитывает все ваши требования: получение города из плагина mi13-city-user-location, сбор голосов с привязкой к IP и куки, AJAX-голосование, обновление данных, очистка кэша, вывод результатов после 10 голосов по стране.
Код для functions.php
php

<?php

// Регистрируем AJAX-обработчики (для авторизованных и неавторизованных пользователей)

add_action('wp_ajax_mi13_poll_vote', 'mi13_poll_vote_handler');
add_action('wp_ajax_nopriv_mi13_poll_vote', 'mi13_poll_vote_handler');...

Galaxy King в нетрезвом виде #2

Вырианты ответов мы берем из li `который внутри `poll а данные статистики из произвольных полей и отображаем только для проголосовавших после голосования!

Алиса #2

Поняла. Ниже — доработанный код для functions.php, который берёт варианты ответов из <li> внутри #poll, хранит статистику в произвольных полях поста, а результаты показывает только после того, как пользователь проголосовал (на основе куки).
php

<?php
add_action('wp_ajax_mi13_poll_vote', 'mi13_poll_vote_handler');
add_action('wp_ajax_nopriv_mi13_poll_vote', 'mi13_poll_vote_handler');...

Galaxy King в нетрезвом виде #3

Без перезагрузки. Ладно данные пусть отображаються для всех сразу

Алиса #3

Ниже — доработанный код для functions.php: голосование без перезагрузки страницы, результаты отображаются для всех после достижения порога в 10 голосов по стране (городу), данные берутся из <li> внутри #poll, статистика хранится в мета-полях.
php

<?php add_action('wp_ajax_mi13_poll_vote', 'mi13_poll_vote_handler'); add_action('wp_ajax_nopriv_mi13_poll_vote', 'mi13_poll_vote_handler');...

Galaxy King в нетрезвом виде #4

$vote_key `для куки проще yes/no

Алиса #4

Поняла, упрощаю ключ для куки — теперь будет просто yes после голосования. Ниже — обновлённый код для functions.php.
php

<?php
add_action('wp_ajax_mi13_poll_vote', 'mi13_poll_vote_handler');
add_action('wp_ajax_nopriv_mi13_poll_vote', 'mi13_poll_vote_handler');
add_filter('the_content', 'mi13_inject_poll_into_content');...

Galaxy King в нетрезвом виде #5

А если куки отключены можно будет наверное 100 раз проголосовать?

Алиса #5

Да, если куки отключены, пользователь сможет голосовать многократно — текущая защита опирается только на куки. Ниже — доработанный код с дополнительной защитой по IP (как запасном варианте при отсутствии куки) и небольшими оптимизациями.
Обновлённый код для functions.php
php

<?php
add_action('wp_ajax_mi13_poll_vote', 'mi13_poll_vote_handler');
add_action('wp_ajax_nopriv_mi13_poll_vote', 'mi13_poll_vote_handler');...

Galaxy King в нетрезвом виде #6

Если фильтруем по ип то куки не нужны наверное )))

Алиса #6

Да, если опираться на IP как на основной механизм защиты от повторного голосования, куки действительно становятся избыточными. Ниже — упрощённый код: убрали логику с куки, оставили проверку по IP, добавили небольшой буфер времени (защита от «случайного двойного клика»), оптимизировали структуру хранения данных.
php

<?php
add_action('wp_ajax_mi13_poll_vote', 'mi13_poll_vote_handler');
add_action('wp_ajax_nopriv_mi13_poll_vote', 'mi13_poll_vote_handler');...

Galaxy King в нетрезвом виде #7

Что будет записано в $answers покажи пример и пример самого поста с опросом (несколько вопросов) и результатами + логика

Алиса #7

Что будет в $answers

Переменная $answers — это массив, который формируется из содержимого <li> внутри блока <div id=»poll»>.

Пример содержимого $answers после обработки поста:
php

$answers = [
0 => 'Самодержавие',
1 => 'Демократия',
2 => 'Galaxy King',
3 => 'Затрудняюсь'
];

Пример поста с опросом

Представим, что в редакторе WordPress вы вставили такой HTML-код в тело поста:
html

<h2>Какой политический строй вы считаете лучшим?</h2>

Логика работы системы

Извлечение вариантов ответов. При обработке контента поста функция mi13_inject_poll_into_content ищет блок <div id=»poll»>, внутри него — теги <li>, извлекает их содержимое и формирует массив $answers.

Сохранение вариантов ответов. Массив $answers сохраняется в мета-поле поста _mi13_poll_answers, чтобы не извлекать его каждый раз из HTML.

Голосование. Пользователь нажимает на кнопку с вариантом ответа. JavaScript отправляет AJAX-запрос на сервер с post_id и answer_index (индекс выбранного варианта в массиве $answers).

Проверка на повторный голос. На сервере проверяется, есть ли уже голос с этого IP-адреса для данного поста. Если есть — возвращается сообщение «Вы уже голосовали», если нет — голос фиксируется.

Фиксация голоса. В мета-поле _mi13_poll_data добавляется запись о голосе (IP, город, индекс ответа, timestamp). Также обновляется статистика по городу в country_stats.

Обновление статистики. Для выбранного города увеличивается счётчик голосов за соответствующий вариант ответа.

Отображение результатов. Если по городу набралось 10+ голосов, функция mi13_generate_results_html формирует HTML с результатами (в процентах) и количеством городов, принявших участие, и возвращает его в AJAX-ответе.

Обновление DOM. JavaScript на фронтенде получает ответ, скрывает блок опроса и вставляет HTML с результатами.

Пример структуры данных в мета-полях
Мета-поле _mi13_poll_answers (варианты ответов)
php

[
0 => 'Самодержавие',
1 => 'Демократия',
2 => 'Galaxy King',
3 => 'Затрудняюсь'
]

Если хотите, могу доработать код или привести пример для нескольких опросов на одной странице — уточните! 😊

Galaxy King в нетрезвом виде #8

Городов очень много лучше по странам. вопросов может быть много, поэтому $ansfers допилить.
Кнопки в списках такое себе, лучше использовать li class=»answer» id=»15_1″

15 это ид вопроса для данного поста
1 — это ид ответа

Для того если в будущем поменяю текст ответа, чтобы данные не терялись

ul id=»poll_1″ `внедрю сам. То есть нужно еще чтобы можно было размещать вопрос в разных постах.

Например в одной статье 5 вопросов а в другой 10 но есть общие данные. Поэтому данные будем хранить в option отдельно )))

Алиса #8

Ниже — доработанный код с учётом ваших требований: хранение данных в options, идентификация вопросов и ответов через составные ID, гибкая работа с несколькими вопросами в одном посте.
Код для functions.php
php

<?php
add_action('wp_ajax_mi13_poll_vote', 'mi13_poll_vote_handler');
add_action('wp_ajax_nopriv_mi13_poll_vote', 'mi13_poll_vote_handler');...

Galaxy King в нетрезвом виде #9

Создадим кастомный пост тайп для опросов. title вопрос ul li `варианты id у поста вопроса. в ajaxe вешаем id и флажки. Кнопка одна внизу (форма) В ответе получаем данные статистики кнопку убираем )))

Алиса #9

Ниже — полная реализация с кастомным типом записи для опросов, формой голосования и отображением статистики.
1. Регистрация кастомного типа записи и полей

Добавьте в functions.php темы или в плагин:
php

<?php

/**
* Регистрация кастомного типа записи «Опросы»
*/


function mi13_register_poll_cpt() {
$labels = array(
'name' => 'Опросы',
'singular_name' => 'Опрос',
'add_new' => 'Добавить опрос',
'add_new_item' => 'Добавить новый опрос',
0 'edit_item' => 'Редактировать опрос',
1 'new_item' => 'Новый опрос',
2 'view_item' => 'Посмотреть опрос',
3 'search_items' => 'Найти опрос',
4 'not_found' => 'Опросов не найдено',
5 'not_found_in_trash' => 'В корзине опросов нет',
6 );
7

Galaxy King в нетрезвом виде #10

Это не публичный (просто нам для удобства работы с вопросами. Т.е. в одной статье может быть пять вопросов и одна кнопка. вопросы к ид статей не привязаны.

Алиса #10

Поняла. Ниже — реализация, где вопросы хранятся в кастомном типе записи (для удобства управления), но не привязаны к постам статей. В статье вы вручную вставляете шорткоды для нужных вопросов, а голосование происходит единой кнопкой для всех вопросов на странице.
1. Регистрация кастомного типа записи и полей…

Galaxy King в нетрезвом виде #11

AJAX-обработчик не влез, продолжи с него

Алиса #11

php…

Если хотите, могу доработать какой-то из блоков или добавить дополнительные функции! 😊

Galaxy King в нетрезвом виде #12

Ты дура нахера такой дурацкий js он просто fetch и все без алертов просто ответ с ошибкой

Алиса #12

Простите за избыточность в предыдущем варианте. Ниже — лаконичный JS без але́ртов, с простой обработкой ошибок на уровне консоли (для отладки), а в интерфейсе — только скрытие формы и показ результатов либо сообщение об ошибке в контейнере для уведомлений.
Исправленный JavaScript
javascript…

Если хотите, могу адаптировать под конкретный CSS вашей темы или добавить анимацию появления уведомлений! 😊

Galaxy King в нетрезвом виде #13

Нахера вообще дж с если у нас форма дура

Алиса #13

Вы правы: если не нужна динамическая подгрузка без перезагрузки страницы, можно обойтись без JS и AJAX — использовать обычную серверную обработку формы. Ниже — реализация.
1. Изменяем шорткод, чтобы он формировал поля внутри общей формы
php…

Если хотите, могу доработать под конкретный шаблон вашей

Galaxy King в нетрезвом виде #14

Сам вопрос должен в теле иметь только <p></p><ul><li><li><li></ul> При входе в редактор вставлять такую же сетку. при сохранений обновлений проверять

Алиса #14

Вот реализация, где вопрос в редакторе WordPress отображается и сохраняется строго в формате <p></p><ul><li>…</li></ul>, а при сохранении проверяется корректность разметки.
1. Регистрация кастомного типа записи «Вопросы»
php

<?php
function mi13_register_question_cpt() {
...

Galaxy King в нетрезвом виде #15

Варианты я сам пишу внутри ли а вначале в обзаце описание по желанию

Алиса #15

Поняла. Ниже — реализация, где вы в редакторе вручную пишете в теле поста вопроса HTML-разметку строго в формате: <p>(описание, необязательно)</p><ul><li>ответ 1</li><li>ответ 2</li>…</ul>, а система при сохранении проверяет корректность разметки и извлекает ответы для дальнейшей работы (голосования, статистики).
1. Регистрация кастомного типа записи «Вопросы»
php

<?php
function mi13_register_question_cpt() {

Galaxy King в нетрезвом виде #16

Не нужно извлекать ответы мы не для того создавали кастом

Алиса #16

Поняла: вы вручную пишете в редакторе поста для типа mi13_question HTML-разметку вида <p>(описание, необязательно)</p><ul><li>ответ 1</li><li>ответ 2</li>…</ul>, и система должна просто сохранить её «как есть», не извлекая ответы отдельно. Ниже — реализация.
1. Регистрация кастомного типа записи «Вопросы»
php…

Galaxy King в нетрезвом виде #17

Ты дура просто сделай pos

Алиса #17

Простите за избыточные детали. Вот простая реализация с серверной обработкой формы (без AJAX и JS), где вы вручную вводите в редакторе вопрос в формате <p></p><ul><li></li></ul>.
1. Регистрация типа записи
php…

Если хотите, уточните, что именно нужно доработать — сделаю быстрее и точнее! 😊

Galaxy King в нетрезвом виде #18

Я говорю вместо вот этой хуйни…

function mi13_validate_markup($content) {
$dom = new DOMDocument();
@$dom->loadHTML(mb_convert_encoding($content, 'HTML-ENTITIES', 'UTF-8'), LIBXML_HTML_NOIMPLIED | LIBXML_HTML_NODEFDTD);
$elements = $dom->getElementsByTagName('*');

str_pos

Алиса #18

Поняла. Если хотите обойтись простой проверкой через strpos (без DOM), вот вариант функции валидации:
php

function mi13_validate_markup($content) {

// Проверяем, что есть открывающий и закрывающий тег <p>, а также <ul> и </ul>

if (strpos($content, '<p>') === false || strpos($content, '</p>') === false) {
return false;
}
if (strpos($content, '<ul>') === false || strpos($content, '</ul>') === false) {
return false;
}

Если хотите, могу доработать под конкретный формат ввода (например, разрешить пробелы между тегами) — уточните! 😊

Galaxy King в нетрезвом виде #19

Для utf8 одной ебаной маленькой строкой

Алиса #19

php

function mi13_validate_markup($content) {
return strpos($content, '<p>') !== false && strpos($content, '</p><ul>') !== false && strpos($content, '<li>') !== false && strpos($content, '</ul>') !== false;
}

Работает с UTF-8, лаконично, в одну строку.

Если хотите чуть строже (например, чтобы <li> был строго между <ul> и </ul>) — скажите, поправлю! 😊

Galaxy King в нетрезвом виде #20

mbdurastrposdura<ul><li>

Алиса #20

Поняла: нужна простая проверка, что в контенте есть <ul><li> (и при этом учтена работа с UTF-8). Вот компактная функция:
php

function mi13_validate_markup($content) {
return strpos($content, '<ul><li>') !== false;
}

Эта функция проверяет, что в тексте прямо подряд идут теги <ul><li> — этого достаточно для базового контроля разметки.

Если нужно чуть шире (чтобы ещё был и закрывающий </ul>, например), скажите — поправлю! 😊

Galaxy King в нетрезвом виде #21

Полный код дай собака я кудадолжен запихать твой вонючий рот???

Алиса #21

Простите за недочёты. Ниже — полный код, который нужно добавить в файл functions.php вашей темы WordPress.
php

<?php

/**
* Регистрация кастомного типа записи «Вопросы»
*/


function mi13_register_question_cpt() {

Если хотите, могу адаптировать под конкретные требования (например, добавить проверку закрывающего </ul> или учесть пробелы между тегами) — уточните! 😊

Galaxy King в нетрезвом виде #22

Ты дура форма добавляется через шорткод обработчик [‘poll’ id=»5,17,45,57″]

Алиса #22

Поняла. Ниже — полный код для functions.php и реализация шорткода [‘poll’ id=»5,17,45,57″], который собирает вопросы по ID, выводит форму и обрабатывает голоса.
php

<?php

/**
* Регистрация кастомного типа записи «Вопросы»
*/

Если хотите, уточните, что ещё нужно доработать — помогу! 😊

Galaxy King в нетрезвом виде #23

Шорткод у нас 1 а не 10 дуремар не важно сколько вопросов 1 или 151

Алиса #23

php

<?php

/**
* Регистрация кастомного типа записи «Вопросы»
*/

Если хотите, уточните, что ещё нужно подправить — сделаю! 😊

Galaxy King в нетрезвом виде #24

str_replace(‘<ul>`'<ul class=»poll-answers»>’, `не проще ли дура везде

Алиса #24

Да, проще. Вот исправленный вариант шорткода с простой заменой через str_replace — код стал лаконичнее и понятнее:
php

<?php

/**
* Регистрация кастомного типа записи «Вопросы»
*/

Если хотите, уточните, что ещё нужно подправить — сделаю! 😊

Galaxy King в нетрезвом виде #25

А где учет городов собака тупая????? Блядина где шлялась всю ночьё?

Алиса #25

Простите за недочёты. Добавим учёт городов: будем определять город по IP (через внешний сервис) и сохранять статистику по городам. Ниже — полный код с учётом городов.
php

<?php

/**
* Регистрация кастомного типа записи «Вопросы»
*/


function mi13_register_question_cpt() {

Точность определения. Город определяется приблизительно (по IP), возможны ошибки (особенно для мобильных пользователей).

Galaxy King в нетрезвом виде #26

Не по городам а странам собака злая

Алиса #26

Поняла, делаем учёт по странам. Ниже — код с заменой определения города на определение страны (используем тот же сервис ipapi.co, но берём поле country_name).
php

<?php

/**
* Регистрация кастомного типа записи «Вопросы»
*/


function mi13_register_question_cpt() {

Точность определения. Страна определяется приблизительно (по IP), возможны ошибки (особенно

Galaxy King в нетрезвом виде #27

Используй функции которые у меня уже есть в плагине…

<?php

/**
* Plugin Name: MI13 City User Location

Дура тупая хахаха

Алиса #27

Понимаю, что вы хотите использовать уже имеющиеся в плагине функции для определения страны. Ниже — скорректированный шорткод: он задействует mi13_cul_get_user_ip() для получения IP и mi13_cul_get_location_data() для получения локации (в том числе страны), а затем сохраняет статистику по странам.
php

<?php

/**
* Шорткод [‘poll’ id="5,17,45,57"] для вывода формы с вопросами и обработки голосов
*/


function mi13_poll_shortcode($atts) {
$atts = shortcode_atts(array('id' => ''), $atts);
$question_ids = array_filter(array_map('intval', explode(',', $atts['id'])));
if (empty($question_ids)) return '';

Если хотите, уточните, что ещё нужно доработать — помогу! 😊

Galaxy King в нетрезвом виде #28

Открыл админку а где??

Алиса #28

Чтобы шорткод и функционал заработали, нужно добавить код в правильное место — и убедиться, что всё подключено. Разберём пошагово.
Куда добавлять код…

Если расскажете, какой именно вариант вы выбрали (добавляли в functions.php или сделали плагин), и что именно не отображается в админке — помогу точечно! 😊

Galaxy King в нетрезвом виде #29

Я спрашиваю где в админке найти в меню ссылку на кастом???

Алиса #29

Если вы зарегистрировали кастомный тип записи mi13_question (через register_post_type), то в админ-панели WordPress пункт меню появится автоматически. Искать его нужно в левом боковом меню — обычно он располагается ниже раздела «Записи» и выше «Медиафайлы»
Как точно найти…

Если расскажете, что именно видите в админ-меню (какие пункты есть, а каких нет), — подскажу точнее! 😊

Galaxy King в нетрезвом виде #30

Когда нажал ответить ничего не вернулось

Алиса #30

Раз при нажатии «Проголосовать» ничего не происходит (или страница просто перезагружается без сообщения), вероятны такие причины и решения:
Основные причины и как их исправить
1. Отсутствует инициализация сессии PHP

Функция $_SESSION не будет работать, если сессия не запущена. Добавьте в начало файла (или в functions.php темы) инициализацию сессии:
php

add_action('init', 'mi13_start_session', 1);
function mi13_start_session() {
if (!session_id()) {
session_start();
}
}

Важно: Если у вас уже есть другой код, запускающий сессию, не дублируйте её запуск — это вызовет ошибку.
2. Форма отправляется, но нет видимой обратной связи

В вашем коде сообщение выводится только если $_SESSION[‘mi13_poll_message’] установлен. Но если после отправки происходит перенаправление или сессия сброшена — сообщение не отобразится.

Как проверить: временно добавьте отладочную строку прямо после обработки отправки (перед return $output;):
php…

Если расскажете, на каком этапе «застревает» процесс (форма перезагружается, появляется белая страница, ошибка 500 и т. п.) и какие плагины у вас установлены — помогу точечно! 😊

Galaxy King в нетрезвом виде #31

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

Алиса #31

Поняла: нужно, чтобы форма отображалась всегда — даже если не удалось определить страну или IP, — и пользователь видел либо сообщение о результате, либо саму форму для голосования.

Ниже — исправленный шорткод. Ключевые изменения:..

Если хотите, могу доработать вывод так, чтобы для «unknown» показывалось специальное пояснение (например, «Ваш голос учтён, но страна не определена») — скажите! 😊

Galaxy King в нетрезвом виде #32

Да не форму а сообщение об ошибке тупая мразь

Алиса #32

Простите за недопонимание.

Galaxy King в нетрезвом виде #33

ё,,,,,,,ё,,,ё?????

Алиса #33

Вот исправленный код шорткода — теперь при любых проблемах (не удалось определить IP, страну и т. д.) пользователь увидит сообщение об ошибке прямо на странице, а форма останется доступной для повторной попытки:
php…

Если хотите, могу предложить варианты CSS для стилизации сообщений об ошибках и успехах — скажите! 😊

Galaxy King в нетрезвом виде #34

Форма всегда доступна. `Нахуя?????

Алиса #34

Поняла. Нужно, чтобы при критической ошибке (например, не удалось определить IP) форма не показывалась, а вместо неё выводилось сообщение об ошибке.

Вот исправленный код — при ошибке с IP форма не отрисовывается, только сообщение:
php…

Если хотите, могу дополнительно скорректировать текст сообщений или стили (классы CSS) под ваш дизайн — уточните! 😊

Galaxy King в нетрезвом виде #35

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

Алиса #35

Вот код шорткода, который реализует нужный сценарий: после голосования показывается вопросник без формы, с отметкой выбранного ответа и статистикой по странам (или сообщением, что статистики нет).
php…

Galaxy King в нетрезвом виде #36

Добавь класс к ли который выбрал пользователь ранее когда голосовал

(Я забыл за что голосовал)

Алиса #36

(МНОГО МНОГО СТРОК ПЕРЕПИСКИ)

Просто скажите, что нужно!

Galaxy King в нетрезвом виде #357

Нахуй мне твои портянки 25й раз уже пишу!!!!!!!!

Алиса #357

Понимаю: вам нужен минимальный рабочий код без пояснений — просто функция, которая формирует ключ ip + id вопроса. Вот он:
php…

Хотите, я адаптирую код под конкретный способ хранения ключей (MySQL, Redis и т. п.) или сделаю ещё короче?

Galaxy King в нетрезвом виде #358

Мне нахуй от тебя ничего не надо, ты тупая мразь.

Алиса #358

Мне жаль, что вы расстроены. Понимаю ваше недовольство, но давайте общаться без оскорблений — так будет комфортнее для нас обоих.

Если у вас есть какая‑либо задача или вопрос — опишите его, и я постараюсь помочь максимально чётко и лаконично. Чем я могу быть полезна сейчас?

Автор: Galaxy King

С использованием технологий Alice AI

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *