Задать вопрос
  • Можно ли в Wodpress подключить два обработчика AJAX к одному и тому же файлу js?

    KaSeo
    @KaSeo Автор вопроса
    Front-end разработчик
    Ответ - да. Размещу пример своего кода, возможно это то, что ты ищешь :)

    Обработка ajax запрос'ов у меня лежит в файле wp-content/themes//assets/js/template.js

    Ниже выдержка кода из своего плагина для темы. Также можно его адаптировать и для файла functions.php - заменить, например, array( $this, 'load_scripts') на 'load_scripts'
    /**
     * РЕГИСТРАЦИЯ ХУКОВ
     */
    public function init() {
    	add_action( 'wp_enqueue_scripts', array( $this, 'load_scripts'), 20 );
    
    	add_action( 'wp_ajax_get_ajax_1_action', array( $this, 'get_ajax_1_callback' ) );
    	add_action( 'wp_ajax_nopriv_get_ajax_1_action', array( $this, 'get_ajax_1_callback' ) );
    
    	add_action( 'wp_ajax_get_ajax_2_action', array( $this, 'get_ajax_2_callback' ) );
    	add_action( 'wp_ajax_nopriv_get_ajax_2_action', array( $this, 'get_ajax_2_callback' ) );
    }
    
    /**
     * ПОДКЛЮЧЕНИЕ СКРИПТОВ
     *
     * Главный файл скриптов темы смотри в wp-content/themes/<theme-name>/assets/js/template.js
     */
    static function load_scripts() {
    
    	$script_data_array_1 = array(
    		'ajax_url' => admin_url( 'admin-ajax.php' ),
    		'security' => wp_create_nonce( 'get_ajax_1' )
    	);
    	$script_data_array_2 = array(
    		'ajax_url' => admin_url( 'admin-ajax.php' ),
    		'security' => wp_create_nonce( 'get_ajax_2' )
    	);
            // id скрипта берется из functions.php или внутри плагина - там где впервые подключается этот скрипт.
    	wp_localize_script( 'template-js', 'get_ajax_1', $script_data_array_1); 
    	wp_localize_script( 'template-js', 'get_ajax_2', $script_data_array_2 ); 
    }
    
    /**
     * ОБРАБОТЧИК AJAX ЗАПРОСА 1
     */
    static function get_ajax_1_callback() {
    	check_ajax_referer('get_ajax_1', 'security');
    	$params = isset( $_POST ) ? $_POST : false; // получаем данные из POST запроса
    	$data = array(); // здесь храним данные для передачи на фронт
    	wp_send_json_success( $data ); // передаем на фронт и через JS обрабатываем данные
    	wp_die();
    }
    
    /**
     * ОБРАБОТЧИК AJAX ЗАПРОСА 2
     */
    static function get_ajax_2_callback() {
    	check_ajax_referer('get_ajax_2', 'security');
    	$params = isset( $_POST ) ? $_POST : false; // получаем данные из POST запроса
    	$data = array(); // здесь храним данные для передачи на фронт
    	wp_send_json_success( $data ); // передаем на фронт и через JS обрабатываем данные
    	wp_die();
    }


    Код из template.js с примером AJAX запроса №1
    $(document).on("click", '.js-button-1', function (event) {
    	event.preventDefault();
    
    	var $btn = $(this),
    		post_id = parseInt($btn.data('post-id'), 10),
    		post_type = $btn.data('post-type'),
    		data = {
    			'action': 'get_ajax_1_action',
    			'post_type': post_type,
    			'post_id': post_id,
    			'security': get_ajax_1.security
    		};
    
    	$.ajax({
    		type: "POST",
    		url: get_ajax_1.ajax_url,
    		data: data,
    		beforeSend: function beforeSend() {
    			// здесь превью пока отправляется запрос на сервер
    		},
    		success: function (response) {
    			// про формат и структуру данных в response читать здесь: https://wp-kama.ru/function/wp_send_json_success
    			
    			if ( response.success ) {
    				var data = response.data;
    				// обрабатываем полученные из backend'а данные
    
    			} else {
    				console.log(response);
    			}
    		}
    	});
    });


    Код из template.js с примером AJAX запроса №2
    $(document).on("click", '.js-button-2', function (event) {
    	event.preventDefault();
    
    	var $btn = $(this),
    		post_id = parseInt($btn.data('post-id'), 10),
    		post_type = $btn.data('post-type'),
    		data = {
    			'action': 'get_ajax_2_action',
    			'post_type': post_type,
    			'post_id': post_id,
    			'security': get_ajax_2.security
    		};
    
    	$.ajax({
    		type: "POST",
    		url: get_ajax_2.ajax_url,
    		data: data,
    		beforeSend: function beforeSend() {
    			// здесь превью пока отправляется запрос на сервер
    		},
    		success: function (response) {
    			// про формат и структуру данных в response читать здесь: https://wp-kama.ru/function/wp_send_json_success
    			
    			if ( response.success ) {
    				var data = response.data;
    				// обрабатываем полученные из backend'а данные
    
    			} else {
    				console.log(response);
    			}
    		}
    	});
    });
    Ответ написан
    Комментировать
  • Как вызвать select при клике по другому элементу?

    KaSeo
    @KaSeo Автор вопроса
    Front-end разработчик
    Решил вопрос самостоятельно.
    Из ul списка формируем optionдля select. С помощью CSS задаем для selectopacity: 0; и располагаем select поверх блока .dropdown__header.

    <div class="s-widget__dropdown dropdown">
        <div class="dropdown__header">
            <div class="dropdown__badge badge">32</div>
            <div class="dropdown__title">Ваши акции</div>
            <button class="dropdown__trigger"></button>
        </div>
        <select class="dropdown__select" name="dropdown_menu"></select>
        <div class="dropdown__menu">
            <ul class="dropdown__list">
                <li class="dropdown__item"><a href="lk-user-discounts.html" class="dropdown__link">Ваши акции</a> <span class="badge">32</span></li>
                <li class="dropdown__item dropdown__item--active"><a href="lk-user-settings.html" class="dropdown__link">Настройки</a></li>
                <li class="dropdown__item"><a href="#" class="dropdown__link">Избранное</a><span class="badge">12</span></li>
                <li class="dropdown__item"><a href="lk-user-card.html" class="dropdown__link">Ваша карта</a></li>
                <li class="dropdown__item"><a href="lk-user-support.html" class="dropdown__link">Поддержка</a></li>
            </ul>
        </div>
    </div>


    if ( $('.dropdown__list').length > 0 ) {
    
        // собираем select из пунктов меню .dropdown__list
        $('.dropdown__list').find('.dropdown__item').each(function () {
            var $item = $(this);
            var $link = $item.find('.dropdown__link');
            var badge = $item.find('.badge').length > 0 ? $item.find('.badge').text() : '';
            var title = $link.text();
            var url   = $link.attr('href');
    
            var $option = '<option value="'+title+'" data-value="'+badge+'" data-url="'+url+'">'+title+'</option>';
            $('.dropdown__select').append($option);
        });
    
        var $badge = $('.dropdown__badge');
        var $title = $('.dropdown__title');
        var $activeItem = $('.dropdown__list').find('.dropdown__item--active');
    
        // Активному пункту меню добавляем selected
        $('.dropdown__select option[value="'+$activeItem.find('.dropdown__link').text()+'"]').attr('selected', true);
        // Подставляем название активного пункта меню в .dropdown__header
        $title.text($activeItem.find('.dropdown__link').text());
        // Отображаем badge если он существует
        $activeItem.find('.badge').length > 0 ? $badge.text($activeItem.find('.badge').text()).css('visibility', 'visible') : $badge.css('visibility', 'hidden');
    }
    
    $(".dropdown__select").on("change", function () {
        var $badge = $('.dropdown__badge');
        var $title = $('.dropdown__title');
        var $current = $(this).find(":selected");
        var url =   $current.data('url');
        var badge = $current.data('value');
    
        // Подставляем название активного пункта меню
        $title.text($current.text());
    
        // Переходим по ссылке
        if (url.length > 0) location.href = url;
    
        if (badge !== undefined && badge !== '') $badge.text(badge).css('visibility', 'visible');
        else $badge.css('visibility', 'hidden').text('');
    });


    В итоге получаем вот такое мобильное меню с выбором нативного select
    5db7311b75daa970962621.png
    Ответ написан
    Комментировать
  • Как заставить работать input file limit в Contact Form 7?

    KaSeo
    @KaSeo Автор вопроса
    Front-end разработчик
    Коллеги, вопрос снят!
    Я невнимательно посмотрел на ко и упустил один набор радиокнопки, который был обязательным и он был в скрытом блоке :D
    Ответ написан
    Комментировать
  • Как использовать vuejs вместе с laravel?

    KaSeo
    @KaSeo
    Front-end разработчик
    Могу поделиться опытом связки Vue и YII2.
    У нас весь vue собирается в папке web/client/dist (название шаблона) и состоит из js и css файлов, который связаны с соответствующим компонентом, т.е. получается на выходе так:
    |───css
    │   create.css
    │   edit.css
    │   main.css
    │   settings.css
    │   view.css
    │      
    ├───images
    │       star.png
    │ 
    ├───js
    │  common.js
    │   create.js
    │   edit.js
    │   main.js
    │   settings.js
    │   view.js

    Глобально для всех страниц подключается js/common.js, а в соответствующих модулях Yii2 подключаются два файла: js и css (например, create.js & create.css)
    В итоге получается, что каждой странице соответствует свой набор js и css файлов.
    Ответ написан
    Комментировать
  • Как изменить option select при клике по внешнему элементу (Safari)?

    KaSeo
    @KaSeo Автор вопроса
    Front-end разработчик
    Разобрался самостоятельно.
    Помогло добавление строки:
    $('#rate').val(val).trigger('change');

    Рабочий пример: https://jsfiddle.net/qsv0okh4/1/
    Ответ написан
    Комментировать
  • Как сделать текст не занимающим места?

    KaSeo
    @KaSeo
    Front-end разработчик
    Родительскому блоку задаешь position: relative, а тексту position:absolute и top/left/right/bottom позиционируешь как нужно.
    Ответ написан
    Комментировать
  • Как сделать клик по ссылки?

    KaSeo
    @KaSeo
    Front-end разработчик
    Привет.
    https://jsfiddle.net/k3dj37kt/

    Для наглядности вывел в отдельный блок все что будет находится в data-large первой ссылки
    Ответ написан
    1 комментарий
  • Как правильно вывести определенное количество символов JQuery?

    KaSeo
    @KaSeo
    Front-end разработчик
    Используйте .each()
    Поправил ваш код, теперь работает все верно.
    https://jsfiddle.net/v74w8t6w/2/
    Ответ написан
    Комментировать
  • Есть ли для PhpStorm, что-то вроде плагина Autoprefixer (для css)?

    KaSeo
    @KaSeo
    Front-end разработчик
    Используйте препроцессор для CSS (LESS || SCSS || SASS). В них можете использовать миксины. К тому же препроцессоры значительно упрощают жизнь и повышают производительность)

    Я привык работать с LESS и в каждом проекте есть файл elements.less с набором миксинов:
    .box-shadow(@arguments) {
      -webkit-box-shadow: @arguments;
      -moz-box-shadow: @arguments;
      box-shadow: @arguments;
    }
    .rotation(@deg:5deg){
      .transform(rotate(@deg));
    }

    В коде просто использую потом, например:
    .box-shadow(0 0 10px rgba(0,0,0, .5));
    или
    .box-shadow(0 0 10px fade(#000, 5%));
    Ответ написан
    Комментировать
  • Как сделать элемент не активным?

    KaSeo
    @KaSeo
    Front-end разработчик
    Используйте свойство CSS pointer-events: none;

    Накидал на скорую руку небольшой прототип :)
    https://jsfiddle.net/oaaoz55b/

    P.S. Если это вам помогло, отметьте, пожалуйста, комментарий как решение.
    Ответ написан