• Расскажите подробно про php://input, как пользоваться?

    php://input возвращает все необработанные данные после HTTP-заголовков запроса, независимо от типа контента.

    Данные, могут быть:
    • application/x-www-form-urlencoded ( application/x-www-form-urlencoded тип application/x-www-form-urlencoded для простых форм- application/x-www-form-urlencoded ) или
    • multipart/form-data-encoded (в основном multipart/form-data-encoded для загрузки файлов)

    Это связано с тем, что это единственные типы контента, которые должны поддерживаться браузерами. Поэтому сервер и PHP традиционно не ожидают получения какого-либо другого типа контента (что не означает, что они не могли бы).

    Если вы просто отправляете POST-ом обычную HTML-форму, запрос выглядит примерно так:
    POST /page.php HTTP/1.1
    key1=value1&key2=value2&key3=value3

    Но если вы много работаете с Ajax, может понадобиться обмен более сложными данными с типами (строка, int, bool) и структурами (массивы, объекты), поэтому в большинстве случаев JSON является лучшим выбором. Но запрос с JSON-полезной нагрузкой выглядел бы примерно так:
    POST /page.php HTTP/1.1
    {"key1":"value1","key2":"value2","key3":"value3"}

    Теперь содержимое будет application/json (или, по крайней мере, ни один из вышеперечисленных), так что $_POST -wrapper из PHP не знает, как с этим справиться (пока).

    Данные всё еще там, вы просто не можете получить к нему доступ через $_POST. Поэтому вам нужно получить его с "сыром" виде помощью file_get_contents('php://input') (если он не закодирован в формате multipart/form-data).

    Это также способ доступа к XML-данным или любому другому нестандартному типу контента.
    Ответ написан
    Комментировать
  • Как в vs code можно посмотреть отличия в строках кода файлов?

    Dimox
    @Dimox
    Верстаю сайты
    1. Открыть оба файла в редакторе.
    2. Нажать Ctrl + Shift + P.
    3. Набрать "compare", нажать на "File: Compare Active File With..." и выбрать второй файл.
    Ответ написан
    Комментировать
  • Почему jetBrains не русифицирует свои продукты?

    Я согласен, что по-хорошему надо бы знать инглиш. Да вот только, снобистский отказ от перевода IDE-шки на другие языки вредит учащимся и новичкам. Для них нужен перевод интерфейса. Хотя бы для начала.

    + почему-то ещё с 2020 есть Language Pack-и на китайском, корейском и японском. А на русском и других языках нет. Как так? Лицемеры!!!!

    + почему-то VS Code имеет перевод на другие языки. И ничего, не ломается как-то. При этом он НА МНОГО популярнее JetBrain-овских IDE-шек.

    Это обыкновенный снобизм. Раньше линуксоиды из-за точно такого же снобизма говорили "нам он и на хуй не нужон, GUI этот ваш! Терминал only love!!!". Но прошло время, и оказалось что всё-таки человеческий подход с GUI всё-таки рациональнее и конструктивнее. То же самое с переводом интерфейса.

    Особенно это актуально на фоне мощного развития всяких инструментов перевода - сайты переводчики, перевод целых интернет страниц в любом браузере, аудио перевод Яндекса и Google Aloude...

    Люди хотят перевода. И люди его заслуживают. А своим снобистским отношением вы просто отпугиваете новичков. Зачем им ваши неудобные IDE если есть VS Code где всё для людей сделано, без этого вашего заколебавшего снобизма красноглазиков.
    Ответ написан
    1 комментарий
  • Как VS code поменять цвет шрифта, мне не нужно менять всю тему, а только цвет переменных?

    В settings.json добавляем:
    "editor.semanticTokenColorCustomizations": {
        "enabled": false
    },
    "editor.tokenColorCustomizations": {
        "textMateRules": [
            {
                "name": "variable",
                "scope": ["variable.other.readwrite"],
                "settings": {
                    "foreground": "#cc12bc"
                }
            }
        ]
    }

    Нажмите Ctrl + Shift + P, чтобы открыть проводник команд. Введите Developer: Inspect Editor Tokens and Scopes, и вы увидите подсказку при клике на нужный атрибут.

    Также, для команды выше, можно назначить горячую клавишу (например F4), Меню → Файл → Настройки → Сочетания клавиш и в строке поиска вводим inspectTMScopes .......

    Или добавить фрагмент кода в файл C:\Users\имя_пользователя\AppData\Roaming\Code\User\keybindings.json

    {
        "key": "f4",
        "command": "editor.action.inspectTMScopes"
    }


    5ed09dceb308f792004261.gif
    Ответ написан
    Комментировать
  • Проблема с подключением к archive ubuntu?

    проверьте настройки сети.
    Адрес "ru.archive.ubuntu.com/ubuntu/pool/main/r/run-one/r..." по Вашей ссылке доступен

    Попробуйте добавить в "/etc/resolv.conf" отдельными строками!!!
    nameserver 8.8.8.8
    nameserver 8.8.4.4
    Ответ написан
    1 комментарий
  • Огромная таблица wp_postmeta как очистить?

    idShura
    @idShura
    Бекап незабудь сделать!

    -- Cleaning wp_commentmeta
    SELECT *
      FROM wp_commentmeta
     WHERE comment_id NOT IN (SELECT comment_id FROM wp_comments);
    
    DELETE FROM wp_commentmeta
     WHERE comment_id NOT IN (SELECT comment_id FROM wp_comments);
    
    SELECT *
      FROM wp_commentmeta
     WHERE meta_key LIKE '%akismet%';
    
    DELETE FROM wp_commentmeta
     WHERE meta_key LIKE '%akismet%';
    
    -- Cleaning wp_postmeta table
    SELECT *
      FROM wp_postmeta pm 
           LEFT JOIN wp_posts wp ON wp.ID = pm.post_id
     WHERE wp.ID IS NULL;
    
    DELETE pm
      FROM wp_postmeta pm 
           LEFT JOIN wp_posts wp ON wp.ID = pm.post_id
     WHERE wp.ID IS NULL;
    Ответ написан
    5 комментариев
  • Как подправить верстку корзины в WOOcommerce?

    @IvanMogilev
    Backend developer: Wordpress,Yii
    Нужно скопировать /wp-content/plugins/woocommerce/templates/cart/cart.php в свой шаблон,что бы получилось /wp-content/themes/*твоя тема*/woocommerce/cart/cart.php
    в этом файле можешь работать,https://businessbloomer.com/woocommerce-visual-hoo... тут визуально показаны хуки которые используются на странице корзины
    Ответ написан
    1 комментарий
  • Как имитировать клик на jQuery/JS?

    @FRI3NDS
    // машинный клик
    let machineEvent = new Event('click', {bubbles:true})
    elem.dispatchEvent(machineEvent)

    //по-желанию можно повесить функцию на этот элемент
    elem.onclick = somefunc
    somefunc() { ... }
    Ответ написан
    Комментировать
  • Как имитировать клик на jQuery/JS?

    sokollondon
    @sokollondon
    Клик по элементу
    $('.btn').click();

    Клик по ссылке (чтобы произошёл переход по ссылке)
    $('a')[0].click();

    Клик по элементу после задержки
    setTimeout(function(){
        $('.btn').click();
    }, 1000);
    Ответ написан
    1 комментарий
  • Как вставить пробел после каждого третьего символа в строке?

    @shuffler_agr0s
    dev
    Готовая функция, возможно даже для себя на будущее ответил)
    function prettify(num) {
                var n = num.toString();
                return n.replace(/(\d{1,3}(?=(?:\d\d\d)+(?!\d)))/g, "$1" + ' ');
            }
    
    prettify(1000000);
    Ответ написан
    1 комментарий
  • Как исправить Uncaught TypeError: $(...).live is not a function?

    svistiboshka
    @svistiboshka
    живые веб интерфейсы
    Этот метод доступен только в jquery До версии 1.7 включительно. замените на .on
    Ответ написан
    4 комментария
  • Как реализовать постраничную навигацию при использовании фильра записей по произвольным полям в WordPress?

    HeadOnFire
    @HeadOnFire
    PHP, Laravel & WordPress Evangelist
    1. Никогда не используйте query_posts. В родной же документации даже написано жирным, query_posts = проблемы с пагинацией!
    2. Для реализации фильтра используйте хук pre_get_posts, в нем забирайте ваши переменные из урл с помощью get_query_var() а не обычным $_GET (WordPress его не любит)
    Ответ написан
    Комментировать
  • Vestacp: стоит устанавливать?

    angrydev
    @angrydev
    По вопросам:
    1. Стоит ли устанавливать на личный сервер? Да, если это не dev-сервер или если вы не собираетесь постоянно компилить nginx, устанавливать сложные связки каких-нибудь пакетов, играться с расширениями (модулями) пакетов.
    2. На счёт связок apache+nginx+php-fcgi или apache+php-fcgi - не советую, об этом ниже в блоке "личный опыт".
    3. Стоит ли сносить апач, пых, мускуль при установке Весты? Да стоит, это советуют на офф. форуме.
    4. Стоит ли ставить на чистую систему? Не обязательно, но лично я - рекомендую.

    ---

    Совет:
    • При работе с конфигами доменов - работайте только с шаблонами которые предусмотренные логикой Весты. Т.е. создавайте, модифицируйте, удаляйте шаблоны как хотите, но домены должны иметь конфиг в шаблоне. Тем самым при очередном обновлении или пересоздании настроек для домена - Вам не будет печально.
    • Закройте доступ к панели по-паролю.
    • Вынесите панель на отдельный домен третьего уровня + установите для неё бесплатный сертификат.
    • В шаблоне настроек домена - закомментируйте подключение конфигов, которые дадут доступ к phpMyAdmin, RoundCube и прочим. Для того, чтобы на эти сервисы не могли лазить с других доменов, кроме домена панели (придётся создать минимум два шаблона для сайтов и для панели). Так же сервисы можно тоже закрыть паролем.
    • Настройте бэкап, например на Y.Disk, тем самым при ЧП у Вас останутся конфиги и данные сайтов на руках.
    • Один домен - один пользователь.

    ---

    Личный опыт:
    Есть пара организаций, с которыми я сотрудничаю, они постоянно клепают какие-то говносайтики и общее количество доменов у обоих превышает сотню. "Программисты" у них не знают как работать с SSH, по этому вкорячил им сначала ispconfig, но он оказался для них очень сложным. Поставил Весту, больше полутора лет - полёт нормальный.
    С тех пор - ставлю её всем под "текучку", т.е. обычные сайты.
    Недавно даже "жуткую блондинку" научил ставить Весту и заводить на неё домены. Т.е. система более чем доступна для понимания.

    Теперь по связке apache+nginx+php-fcgi, неоднократно убедился в том, что nginx+php-fpm быстрее.
    Делал сравнение до и после, VDS, ОС, железо - без изменений, оптимальные настройки для ресурсов, но последняя ссвязка - всё равно быстрее.
    Тут хочу уточнить то, что я не считал у проектов не скорость работы php-кода microtime(true), а количество страниц в секунду которые отдаст сервер до появления первой ошибки.

    Любые сайты, самописы, CMS, везде где мне приходилось переводить на новую связку - прирост в среднем более чем в 4 раза. Если же версию php повысить до 7.* - то прирост будет ещё больше и "узким горлышком" останется только MySQL.
    Так что советую nginx+php-fpm. Но если вы собираетесь устанавливать версию php5.6, то Вам придется слегка переделать установочный скрипт (перебить вхождения php на php5.6) и подключить репозиторий для старой версии перед выполнением скрипта:
    apt -y install software-properties-common && 
    add-apt-repository -y ppa:ondrej/php && 
    apt update
    Ответ написан
    4 комментария
  • Как вывести метки на яндекс карту взяв адреса из кастомных полей записей?

    azerphoenix
    @azerphoenix
    Java Software Engineer
    Здравствуйте!
    Нечто похожее нам приходилось реализовать для одного клиента.
    Единственное отличие - метка добавляется не из катомных записей, а на конкретной странице, на которой при помощи ACF Repeater созданы кастомные поля.
    Краткая инструкция:
    1) Создайте поле ACF Repeater + 2 кастомных поля Широта и Долгота и выведите на странице
    2) При помощи яндекс карт (https://yandex.ru/maps/) клиент находит координаты объекта и прописывает его через repeater в кастомные поля Широта и Долгота.
    3) Создайте шаблон (скопируйте page.php) и назначьте его для созданной вами страницы.
    Пример подобного шаблона:
    В данном коде присутствует лишний код. Но думаю, что вы найдете необходимые участки...
    Пример шаблона
    <div class="container content-page">
    		<div class="page-content">
    			<div class="row">
    				<div class="content col-md-12">
    					<div id="customMap" class="YMaps" style="width:100%;height:400px;">
    					</div>
    					<?php if( have_rows('example_mebel') ): ?>
    						<?php $yamap = [];?>
    						<?php while( have_rows('example_mebel') ): the_row(); ?>
    							<!-- baloon content -->
    							<?php $example_title = get_sub_field('example_title') ?>
    							<?php $example_address = get_sub_field('example_address') ?>
    							<?php $example_phone = get_sub_field('example_phone') ?>
    							<?php $example_time = get_sub_field('example_time') ?>
    							<?php 
    
    	$example_placemark_type = array
    	("twirl#darkgreenStretchyIcon","twirl#greenStretchyIcon"); 
    
    								// $example_placemark_type = array("twirl#redIcon", "twirl#darkblueIcon", "twirl#pinkIcon", "twirl#darkorangeIcon", "twirl#violetIcon"); 
    							?>
    							<!-- baloon content -->
    							<?php $tempID = get_sub_field( 'example_id'); ?>
    							<?php $cityName = get_sub_field( 'example_city'); ?>
    							<?php if( have_rows('example_places') ): while( have_rows('example_places') ): the_row();  ?>
    								<?php $example_longitude = get_sub_field( 'example_longitude'); ?>
    								<?php $example_lattitude = get_sub_field( 'example_lattitude'); ?>
    								
    							
    							<!---->
    
    							<?php
    								array_push
    								(
    									$yamap,
    									[
    										"lat" => $example_lattitude,
    										"lon" => $example_longitude,
    										"header" => $example_title,
    										"address" => $example_address,
    										"time" => $example_time,
    										"footer" => $example_phone,
    										"placemark" => $example_placemark_type[array_rand($example_placemark_type)],
    										"id" => $tempID,
    										"city" => $cityName
    									]
    								);
    
    							?>
    								<?php endwhile; endif; ?>
    						<?php endwhile; ?>
    					<?php endif; ?>
    				</div>
    				<div style="padding: 10px 0 !important; clear: both;"></div>
    				<div class="content col-md-12">
    					<?php if( have_rows('example_mebel') ): ?>
    						<div class="example_accordion">
    							<div class="panel-group" id="accordion">
    
    						<?php while( have_rows('example_mebel') ): the_row(); ?>
    							
    							<!--example_places-->
    								<!-- begin object -->
    								
    										<!-- ** -->
    										<?php if ($example_title = get_sub_field('example_title')) { ?>
    											<?php ($example_id = get_sub_field('example_id')); ?>
    										
    
    										 
    											<div class="panel panel-default">
    											  <div class="panel-heading">
    												<h4 class="panel-title">
    												  <a data-toggle="collapse" data-parent="#accordion" href="#<?php echo $example_id ?>"><?php echo $example_title ?><?php if ($example_city = get_sub_field('example_city')) { ?><span style="float:right;"><?php echo $example_city  ?></span><?php } ?></a>
    												</h4>
    											  </div>
    											  <div id="<?php echo $example_id ?>" class="panel-collapse collapse">
    												<div class="panel-body">
    													<?php if ($example_address = get_sub_field('example_address')) { ?>
    														<div class="faq_answer"><span class="fa fa-map-marker"><?php echo $example_address ?></span></div>
    													<?php } ?>
    													<?php if ($example_time = get_sub_field('example_time')) { ?>
    														<div class="faq_answer"><span class="fa fa-clock-o"><?php echo $example_time ?></span></div>
    													<?php } ?>
    													<?php if ($example_phone = get_sub_field('example_phone')) { ?>
    														<div class="faq_answer"><span class="fa fa-phone"><?php echo $example_phone ?></span></div>
    													<?php } ?>
    													<?php if ($example_mail = get_sub_field('example_mail')) { ?>
    														<div class="faq_answer"><span class="fa fa-at"><?php echo $example_mail ?></span></div>
    													<?php } ?>
    													<div class="gallery">
    														<?php $images = get_sub_field('example_gallery');
    															if( $images ): ?>
    																<ul>
    																	<?php foreach( $images as $image ): ?>
    																		<li>
    																			<a href="<?php echo $image['url']; ?>">
    																				 <img src="<?php echo $image['sizes']['thumbnail']; ?>" alt="<?php echo $image['alt']; ?>" />
    																			</a>
    																		</li>
    																	<?php endforeach; ?>
    																</ul>
    														<?php endif; ?>
    													</div>
    												</div>
    												<div class="panel-footer">
    													
    												</div>
    											  </div>
    											</div>
    										  
    										<?php } ?>
    								
    								<!-- end object -->
    						<?php endwhile; ?>
    							</div>
    						</div>
    					<?php endif; ?>
    				</div>
    			</div><!-- end row-fluid -->
    		</div>
    	</div><!-- end container -->
    <?php echo "<script type=\"text/javascript\"> var points=".json_encode($yamap, true)."</script>" ?>;


    4) Далее подключите 2 скрипта для данной страницы:
    function register_scripts_map() {
    		wp_register_script('custom', get_stylesheet_directory_uri() .
    			'/js/custom.js');
    		wp_enqueue_script('custom');	
    		wp_register_script("yMapJS", "https://api-maps.yandex.ru/2.0/?load=package.full&lang=ru-RU");
    		wp_enqueue_script("yMapJS");
    }
    
    add_action('wp_enqueue_scripts', 'register_scripts_map');

    5) Содержимое скрипта custom.js
    custom скрипт
    var zoom = 16,
        // mapCenter = [55.709992,37.654287];
        // mapCenter = [points[0].lat, points[0].lon],
        referenceCity = ['Москва', 'Санкт-Петербург'],
        mapAlwaysReady = false;    
    var customMap,
        mapCenter;
    function showCurrentPlace(event)
    {
        event.preventDefault();
        var currentSelectedItem = jQuery(this).find('a').attr('href').substr(1),
        currentSelectedPoint = 
            points.filter(function(item){return item.id == currentSelectedItem;})[0];
        if(mapAlwaysReady)
        {        
            customMap.setCenter([currentSelectedPoint.lat, currentSelectedPoint.lon]);
            customMap.setZoom(zoom);
        }    
        console.table(currentSelectedPoint);
    }
    
    function getMinMax(sourceArray, field)
    {
        var maxPrice = Math.max.apply(Math, sourceArray.map(function(item){return item[field];})),
            minPrice = Math.min.apply(Math, sourceArray.map(function(item){return item[field];})) 
        return {max: maxPrice, min: minPrice};
    }
    function mapReady()
    {   
        customMap = new ymaps.Map('customMap', 
        {
            center: mapCenter,
            zoom: zoom
        });
    
        points.forEach(function(item)
        {
            customMap.geoObjects.add
            (
                new ymaps.Placemark
                (
                    [item.lat, item.lon], 
                    {
                        iconContent: item.header, 
                        balloonContentHeader: item.header, 
                        balloonContentBody: 
                            item.address + 
                            '<br>' +
                            item.time
                            , 
                        balloonContentFooter: item.footer
                    },
                    {
                        preset: item.placemark //"twirl#pinkStretchyIcon"
                    }
                )
            );    
        });
        mapAlwaysReady = true;    
        var tempBounds = points.reduce
        (
            function(prev, cur)
            {       
                // return referenceCity.filter(function(itemCity)
                // {
                //     return itemCity == cur.city;
                // }).length > 0 ? prev.concat({lat: cur.lat, lon: cur.lon}) : prev; 
                return prev.concat({lat: cur.lat, lon: cur.lon});
            }, 
            []
        ),
        referenceBounds = 
        {
            lats: getMinMax(tempBounds, 'lat'),
            longs: getMinMax(tempBounds, 'lon'),
        };
        customMap.setBounds
        (
            [
                [referenceBounds.lats.min, referenceBounds.longs.min], 
                [referenceBounds.lats.max, referenceBounds.longs.max]
            ]
        );
    }

    Конечный результат - https://massimomebel.com/gde-kupit
    Конечно же вам придется переделать скрипт, чтобы собирать метки из кастомных записей, а не со страницы. Но в целом идея похожа.
    Если вас устроит идея добавления маркеров на основе Google Maps, то тут подробная инструкция об интеграции с CPT https://wpbeaches.com/create-multiple-marker-map-f...
    Ответ написан
    4 комментария
  • Существуют ли сайты, которые созданы в Elementor и от которых сносит крышу?

    @ZloySeohnik
    На оф. сайте есть ежемесячный Топ сайтов на Elementor: https://elementor.com/blog/showcase-december-2019/

    Посмотрите, там есть очень сильные работы.

    Моё мнение такое, что Ele это такой же инструмент как холст, палитра, кисти у художника. Нужно просто освоить его. Поэтому самые крутые работы получаются у веб-дизайнеров.

    Но основная аудитория у Ele, это малый бизнес который не понимает ничего в разработке и фрилансеры с бирж "Сайт за 5к".

    И самое главное, цель 99% сайтов - это продажи. Значит сайт должен быть не "крышесносным", а полезным, информативным, лаконичным и простым. У дизайнерских работ другая цель - запомнится.

    Поэтому действительно WOW проектов не так легко найти. Но они есть.
    Ответ написан
    Комментировать
  • Как отследить завершение всех ajax запросов на странице?

    @sergeystepanov1988
    Сделать с помощью метода ajaxStop:
    $( document ).ajaxStop(function() {
         $('.cool').append(data);  
    });
    Ответ написан
    6 комментариев
  • Как узнать обработчики событий на элементе?

    gaparchi
    @gaparchi
    В firefox, в инспекторе, выбираешь элемент и справа появляется кнопочка "ev". Иногда очень помогает и даже когда Chrome Dev Tools -> Event Listeners бессилен.
    5ac8179adf3b2107101641.png
    Ответ написан
    Комментировать