• Как настроить перенаправление редирект?

    artzolin
    @artzolin Куратор тега WordPress
    php, WordPress разработка сайтов artzolin.ru
    Решение на php, в зависимости от структуры ссылок, возможно нужно доработать

    if ( ! function_exists( 'template_redirect_callback' ) ) {
    
    	/**
    	 * Function for 'template_redirect` action-hook.
    	 * 
    	 * @return void
    	 * 
    	 * @since 1.0.0
    	 */
    	function template_redirect_callback() {
    
    		global $wp;
    
    		if ( str_contains( $wp->request, 'zapchasty/' ) ) {
    
    			$new_url = str_replace( 'zapchasty/', '/spareparts/', $wp->request );
    
    			wp_safe_redirect( home_url( trailingslashit( $new_url )  ), 301 );
    		}
    	}
    }
    add_action( 'template_redirect', 'template_redirect_callback' );
    Ответ написан
    Комментировать
  • Как добавить несколько наименований в одну метку?

    0xD34F
    @0xD34F Куратор тега Яндекс.Карты
    Сгруппируйте данные по координатам:

    const grouped = productData.reduce((acc, n) => (
      (acc[n.coordinates] ??= []).push(n),
      acc
    ), {});

    Соответственно, когда будете собирать строку для ballonContent метки, вместо одного объекта придётся пробежать по массиву объектов:

    for (const [ coord, data ] of Object.entries(grouped)) {
      const placemark = new ymaps.Placemark(
        coord.split(',').map(parseFloat),
        {
          balloonContent: data
            .map(n => `
              <div>
                ${n.address}
                <br>
                <a href="${n.productURL}">Подробнее</a>
              </div>`)
            .join(''),
        },
        {
          preset: 'islands#blueDotIcon',
          maxWidth: 300,
        }
      );
    
      map.geoObjects.add(placemark);
    }

    Или, воспользуйтесь кластеризатором:

    const placemarks = productData.map((n, i) => new ymaps.Placemark(
      n.coordinates.split(',').map(parseFloat),
      {
        balloonContent: `${n.address}<br><a href="${n.productURL}">Подробнее</a>`,
        clusterCaption: `Адрес №${i + 1}`,
      },
      {
        preset: 'islands#blueDotIcon',
        maxWidth: 300,
      }
    ));
    
    const clusterer = new ymaps.Clusterer({
      clusterDisableClickZoom: true,
    });
    
    clusterer.add(placemarks);
    map.geoObjects.add(clusterer);
    Ответ написан
    1 комментарий
  • Что может отслеживать конкретный сайт и как с этим бороться?

    @rPman
    Косвенная информация о месторасположении
    - по ip адресу клиента и по времени ответа можно выявить наличие vpn и даже расстояние от клиента до выходной ноды vpn
    - наличие прокси, с теми же возможностями, а если прокси внезапно на том же адресе что и выходной ip и анонимна, то анализ может быть более подробный

    Атака на сеть
    - можно анализировать локальную сеть запросами, подбирая ip адреса и типовые порты можно обнаружить наличие роутера и даже его тип (cors не дает читать содержимое https->http но есть информация о заголовках и самом факте верного ответа), помимо роутера программисты часто в десктопных приложениях поднимают веб сервер (особо криворукие - без авторизации), это можно обнаружить и при наличии ошибок даже на него повлиять (повторяю, пользователь заходит на веб сайт, и его локальная сеть может быть просканирована, уязвимые приложения найдены и атакованы... я наблюдал как сбер онлайн делал такое сканирование, делая запросы к localhost по разным портам), примером таких приложений могут быть remote control медиа плееров.
    - XSS/CSRF. открывая уязвимые веб приложения в прозрачном iframe можно двигать его под мышь пользователя таким образом, чтобы пользователь не ведая того, кликак в этом приложении в нужных местах (уязвимое приложение будет открыто с авторизацией пользователя, это оправдано и такие еще встречаются), доступа к данным не будет но действия пользователя пройдут.
    - можно просто ddos-ить какой-либо сайт запросами, которые будут идти от пользователя но referer так подделать нельзя, т.е. будет видно кто виновник (понятно что в iframe можно открыть заранее сгенерированные мусорные домены)
    Помню в одном веб приложении была ошибка, оно не проверяло результат и случайно ddos-ило гугловский сервис, который в результате отказывал в обслуживании пользователю вне этого веб приложения.
    - используя webrtc можно даже вылезти в локальную сеть (найти соседний браузер без proxy/vpn если там тоже открыта страница сервера)
    Было время, когда при использовании java applet/flash/silverlight и прочих нативных аддонов, можно было еще сильнее вылезать из браузерной песочницы и вытворять в сети пользователя лютую дичь.
    - есть какие то направления в атаке через уведомления (если ты подписываешься на них на сайте, всплывающее окошко с ним открывается в ином контексте безопасности чем оригинальная страница), я не изучал но наверняка тут тоже можно что то вытянуть

    Типовая информация о железе
    - характеристики монитора (разрешение, масштабирование, глубина цвета - хотя все уже 32бит но слабые железки могут быть все еще 16битными)
    Из размера окна можно вытянуть информацию об операционной системе, нестандартном оборудовании и установленных темах, меняющих его размер
    - производительность cpu и gpu замеряя их бенмчмарками
    можно вычислять размер кеша и от сюда косвенно получать информацию о модели процессора и даже о вендоре intel/amd/... arm
    - почти полную информацию о gpu и даже попытку скрыть ее за виртуальной машиной
    - через тайминги и сетевой бенчмарк можно собрать информацию о скорости сети (ethernet или wifi)
    - через storage api можно собрать бенчмарки по скорости жесткого диска, как минимум можно понять hdd или ssd
    - инструмент ввода мышь/тачпад, даже если ты на планшетнике запускаешь мобильный браузер в режиме и в режиме PC, по тому как работает пользователь с тачпадом можно вытянуть информацию (отсутствие mousemove там где оно должно быть)

    Атака на железо
    - до сих пор я вижу сообщения о закрываемых уязвимостях доступа к gpu ram при использовании особенностей gpu, доступные в т.ч. из браузера, т.е. буквально вытаскивают изображение экрана и содержимое окон соседних приложений... это не просто, не гарантированно но при наличии желания и ресурсов, адресные атаки возможны, не удивлюсь если так будут воровать веса приватных нейронок.
    - из производительности кеша процессора вытягивают информацию об оперативной памяти соседних процессов (уязвимости Meltdown/Spectre) но это еще сложнее

    Информацию о софте
    - класс браузера (firefox/chromium и при желании opera/edge/...) по поведению javascript и многим специфическим особенностям и само собой по заголовках запроса по useragent (это само собой подменяется)
    - наличие некоторых плагинов (по тому что они добавляют на странице, например api или специфические изменения)
    например блокировщики рекламы выявляются не сложно, правда лучше прикручивать автоматизацию на основе публикуемых правил

    Доступ к clipboard
    - clipboard api не дает доступа к буферу обмена, но при клике на страницу возможна его подмена, типовой пример - пользователь держит в буфере финансовую информацию (номер счета например) и кликая по 'сайту с инструкциями' может получить подмену содержимого буфера и вставить эту подмену как адрес для денежного перевода.

    Передача сообщений через звук
    - Веб приложения, на клик, могут включить воспроизведение звука на высоких частотах, не слышимых человеческим ухом (ультразвук или инфразвук), но который способно уловить соседнее устройство на котором уже запущено соответствующее приложение или веб с открытым доступом (например у тебя в фоне открыта страница, постоянно передающее звуковые сообщения, тут же ты голосом общаешься в публичном чате, владелец сайта может использовать это чтобы связать тебя в этом чате с открытой веб страницей)

    p.s. а сколько открывается дивных возможностей, когда веб сервис запрашивает доступ к чему то еще и пользователь его разрешает, типа камера, положение по gps, доступ к clipboard,..

    Как бороться - отдельное железо для чувствительных вещей, или наоборот, отдельное железо для развлечения и интернета. Всегда помнить об этом (та же атака через звук).
    Ответ написан
    2 комментария
  • Выдать права для пользователя на 7 дней?

    artzolin
    @artzolin Куратор тега WordPress
    php, WordPress разработка сайтов artzolin.ru
    Вряд ли из-за 15 строк кода кто-то будет писать настолько уникальный функционал

    // устанавливаем роль и дату начала тестового периода
    function set_user_test_period() {
    
    	$current_date = date( 'd-m-Y H:i:s' );
    
    	// пишем в мету юзера текущее время
    	add_user_meta( $user_id, '_test_period_start_date', $current_date, true );
    
    	$user = new WP_User( $user_id );
    
    	// добавляем роль участника
    	$user->add_role( 'contributor' );
    
    }
    
    
    // проверка завершения тестового периода
    function check_user_test_period() {
    
    	$current_date = date( 'd-m-Y H:i:s' );
    	$user_id = get_current_user_id();
    
    	$test_period_start_date = get_user_meta( $user_id, '_test_period_start_date', true );
    
    	$user = new WP_User( $user_id );
    
    	// проверяем, что текущая дата больше тестового периода
    	if ( strtotime( $current_date ) > strtotime( $test_period_start_date . ' + 7 days' ) ) {
    		// убираем роль участника
    		$user->remove_role( 'contributor' );
    	}
    
    }


    Писал без тестов, может что-то не работать и логику нужно доработать по необходимости
    Ответ написан
    2 комментария
  • Как отключить автосохранение и черновики в WordPress?

    develx
    @develx
    Web developer
    Чтобы вообще отключить ревизии в wp-config.php прописать

    define( 'WP_POST_REVISIONS', false );

    Удалить уже сохраненные ривизии плагином WP-Optimize или запросом в БД

    DELETE FROM wp_posts WHERE post_type = "revision";

    Автосохранение сделать с интервалом в 24 часа в wp-config.php

    define( 'AUTOSAVE_INTERVAL', 86400 );

    Отключить автосохранение в functions.php темы

    function disable_autosave() {
        wp_deregister_script( 'autosave' );
    }
    add_action( 'admin_init', 'disable_autosave' );
    Ответ написан
    4 комментария
  • Как вывести более десяти Inline кнопок?

    @twistfire92
    Python backend developer
    Внимательно смотрим на строку с добавлением 11-й кнопки

    button11 = types.InlineKeyboardButton('БОЛЬШЕРЕЧЬЕ ', callbsck_data='11')

    Внимательнее с очепятками.
    А что ниже по коду у вас творится??? Ужас же адовый!!! Зачем столько повторений?
    Ответ написан
    2 комментария
  • Динамически адаптивный шрифт html/css?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    line-height: normal;
    Ответ написан
    Комментировать
  • Как разместить Label в python kivy?

    @maximsemin23
    я делаю программу которая пишет за тебя код, но не знаю как разместить label

    Удачи!
    Ответ написан
    3 комментария
  • Что лучше использовать веб-разработчику: Linux Mint или Ubuntu?

    Adamos
    @Adamos
    Вы задаете вопрос, который ежемесячно обсасывается на Тостере вдоль и поперек.
    Значит, привычки гуглить и навыка читать нагугленное нет.
    Следовательно, Линукс противопоказан. Dixi.
    Ответ написан
    2 комментария
  • Удалять ли ненужные записи в базе данных или оставлять?

    rozhnev
    @rozhnev Куратор тега MySQL
    Fullstack programmer, DBA, медленно, дорого
    Я бы поступил следующим образом:
    1. создать ёще одну таблицу с идентичной структурой
    2. при удалении переносить из основной таблицы в архив

    Преимущества:
    1. основная таблица остается компактной
    2. при необходимости можно всегда восстановить данные
    Ответ написан
    2 комментария
  • Есть ли какие-то сервисы для натяжки html на WP?

    iiiBird
    @iiiBird Куратор тега HTML
    Пока ты спишь - твой конкурент совершенствуется
    такой сервис называется фриланс https://freelance.habr.com/
    Ответ написан
    Комментировать
  • Как на тему Zante установить плагинфы если выбивает An error occurred while installing Eagle Booking: Загрузка не удалась. Not Found?

    OtshelnikFm
    @OtshelnikFm Куратор тега WordPress
    Обо мне расскажет yawncato.com
    обратись за помощью туда где качал этот нулл. Тут пиратам не помогают

    #noWarez
    Ответ написан
    Комментировать
  • Как обновить кэш сайта у клиентов?

    artzolin
    @artzolin Куратор тега WordPress
    php, WordPress разработка сайтов artzolin.ru
    Функция wp_enqueue_style() четвертым параметром принимает версию файла. Браузер ее смотрит и если новой версии у него нет - скачивает

    wp_enqueue_style( $handle, $src, $deps, $ver, $media );


    Для удобства вы можете передавать в этот параметр дату последнего изменения файла в UNIX:

    $ver = filemtime(get_stylesheet_directory() . '/assets/css/common.min.css');


    Такая же логика работает и для функции wp_enqueue_script()
    Ответ написан
    Комментировать
  • Как изменить структуру дочернего пункта меню в Wordpress?

    AntonLitvinenko
    @AntonLitvinenko
    HTML coder
    Изменение разметки производится путем изменения класса walker_nav_menu
    https://misha.agency/wordpress/nav-menu-walkers.html

    Готовый код

    <?php
    
    class Header_Walker_Nav_Menu extends Walker_Nav_Menu {
    
    	function start_lvl( &$output, $depth = 0, $args = NULL ) {
    		$output .= '<ul class="submenu sub-menu">';
    	}
    
    	function start_el( &$output, $item, $depth = 0, $args = NULL, $id = 0 ) {
    		//global $wp_query;
    
    		$indent = ( $depth ) ? str_repeat( "\t", $depth ) : '';
    
    		$class_names = $value = '';
    		$classes = empty( $item->classes ) ? array() : (array) $item->classes;
    		$classes[] = 'menu-item-' . $item->ID;
    
    		if ($args->walker->has_children) {
    			$classes[] = 'has-dropdown';
    		}
    
    		// функция join превращает массив в строку
    		$class_names = join( ' ', apply_filters( 'nav_menu_css_class', array_filter( $classes ), $item, $args ) );
    		$class_names = ' class="' . esc_attr( $class_names ) . '"';
    
    		$id = apply_filters( 'nav_menu_item_id', 'menu-item-'. $item->ID, $item, $args );
    		$id = strlen( $id ) ? ' id="' . esc_attr( $id ) . '"' : '';
    
    		$output .= $indent . '<li' . $id . $value . $class_names .'>';
    
    		// атрибуты элемента, title="", rel="", target="" и href=""
    		$attributes  = ! empty( $item->attr_title ) ? ' title="'  . esc_attr( $item->attr_title ) .'"' : '';
    		$attributes .= ! empty( $item->target )     ? ' target="' . esc_attr( $item->target     ) .'"' : '';
    		$attributes .= ! empty( $item->xfn )        ? ' rel="'    . esc_attr( $item->xfn        ) .'"' : '';
    		$attributes .= ! empty( $item->url )        ? ' href="'   . esc_attr( $item->url        ) .'"' : '';
    
    		// ссылка и околоссылочный текст
    		$item_output = $args->before;
    		if ($args->walker->has_children) {
    			$item_output .= '<span class="opener"><a'. $attributes .'>';
    		} else {
    			$item_output .= '<a'. $attributes .'>';
    		}
    
    		$item_output .= $args->link_before . apply_filters( 'the_title', $item->title, $item->ID ) . $args->link_after;
    
    		if ($args->walker->has_children) {
    			$item_output .= '</a></span>';
    		} else {
    			$item_output .= '</a>';
    		}
    
    		$item_output .= $args->after;
    
    		$output .= apply_filters( 'walker_nav_menu_start_el', $item_output, $item, $depth, $args );
    	}
    }


    Для понимания как это работает, берем прямо копируем весь класс walker_nav_menu и там где нужно делаем манипуляции. Конкретно в этом коде добавлен класс submenu к выпадающему меню, добавлен класс has-dropdown к элементу li, внутри которого будет выпадающее меню и завернуты в span с классом opener ссылки, если у родительского li есть выпадающее меню.

    В принципе, если вам нужно пункт меню у всех завернуть, то можно поступить следующим образом
    <?php
    	wp_nav_menu(
    		array(
    			'theme_location'  => 'main-menu',
    			'menu'            => '', 
    			'container'       => false, 
    			'menu_class'      => 'main-menu', 
    			'depth'           => 2,
    			'before'          => '<span class="opener">',
    			'after'           => '</span>',
    			//'walker'          => new Header_Walker_Nav_Menu,
    		)
    	);
    ?>

    В этом случае разметка добавится во всех пунктах меню, независимо, есть у нее подменю или нет.
    Ответ написан
    3 комментария
  • Какое состояние у современного фриланса на конец 2020?

    Serhioromano
    @Serhioromano
    Web Developer
    Алло, это у вас курсы программистов?
    Какие курсы, это библиотека, а вам какие курсы нужы?

    Согласен. Фриланс это как очередь за водкой в 90е, клином. Кто протиснулся, тот и взял. Но не больше пузыря. Есть еще индусы, которые даже со средним уровням могут рубить по 2-3 доллара в час. Фриланс очень жесткий рынок.

    Но, тем не менее если лежать с открытыми глазами, ты не уснешь. Можно начать получать опыт, браться за проекты любые по минимуму, все ради опыта, клиентской базу, рейтига и портфолио. Глядишь когда ты подтянешь свои знания и профиль у тебя будет уже готов к конкуренции.
    Ответ написан
    1 комментарий
  • Как сделать калькулятор доставки woocommerce?

    artzolin
    @artzolin Куратор тега WordPress
    php, WordPress разработка сайтов artzolin.ru
    Нормальных плагинов я не видел, но если они есть, меня поправят. Вот решение с помощью api яндекс карт, проверка адреса на попадание в зону доставки https://yandex.ru/dev/maps/jsbox/2.1/delivery_zones
    Ответ написан
    Комментировать
  • Почему запуск cURL из-под WordPress вызывает Internal Server Error?

    dimonchik2013
    @dimonchik2013
    non progredi est regredi
    логи смотри

    банально нет курла например
    Ответ написан
    1 комментарий