• Как в Битриксе настроить редирект ссылок без слеша в конце на с ним?

    alexyarik
    @alexyarik
    Битрикс разработчик
    #*со страниц без слеша на слеш*
    		RewriteCond %{REQUEST_URI} !\?
    		RewriteCond %{REQUEST_URI} !\&
    		RewriteCond %{REQUEST_URI} !\=
    		RewriteCond %{REQUEST_URI} !\.
    		RewriteCond %{REQUEST_URI} !\/$
    		RewriteRule ^(.*[^\/])$ /$1/ [R=301,L]
    Ответ написан
    2 комментария
  • WooCommerce - как в/shop заменить ссылку на товар на ссылку из атрибутов?

    @Rylezzz Автор вопроса
    Да, детка!
    Я понимаю, что для многих пользователей это детский лепет, но для меня это победа))

    Как я реализовал задуманное.

    ВАЖНО! сохраняйте оригиналы всех изменяемых файлов. А ещё лучше - сделайте на всякий случай бэкап на хостинге

    Вывод данных в мини-карточке в магазине /shop производится посредством хуков (hook) в файле content-product.php темы.
    Оригинальный content-product.php
    <?php
    
    if ( ! defined( 'ABSPATH' ) ) {
    	exit; // Exit if accessed directly
    }
    
    global $product, $woocommerce_loop;
    
    // Ensure visibility
    if ( empty( $product ) || ! $product->is_visible() ) {
    	return;
    }
    
    // Store column count for displaying the grid
    if ( empty( $woocommerce_loop['columns'] ) ) {
    	$woocommerce_loop['columns'] = apply_filters( 'loop_shop_columns', 3 );
    }
    
    // Extra post classes
    $classes = array();
    if ($woocommerce_loop['columns'] == 2) {
    	$classes[] = 'col-md-6';
    }elseif($woocommerce_loop['columns'] == 4){
    	$classes[] = 'col-md-3';
    }elseif($woocommerce_loop['columns'] == 6){
    	$classes[] = 'col-md-2';
    }else{
    	$classes[] = 'col-md-4';
    }
    ?>
    <div <?php post_class( $classes ); ?>>
    <div class="product-item">
    	<?php
    	/**
    	 * woocommerce_before_shop_loop_item hook.
    	 *
    	 * @hooked woocommerce_template_loop_product_link_open - 10
    	 */
    	do_action( 'woocommerce_before_shop_loop_item' );
    	?>
    	<b><a href="<?php the_permalink(); ?>" class="products-warp"></b>
    	<?php
    	/**
    	 * woocommerce_before_shop_loop_item_title hook.
    	 *
    	 * @hooked woocommerce_template_loop_product_thumbnail - 10
    	 * @hooked woocommerce_show_product_loop_sale_flash - 10
    	 */
    	do_action( 'woocommerce_before_shop_loop_item_title' );
    	?>
    	<b></a></b>
    	<div class="product-info">
    	<b><a href="<?php the_permalink(); ?>"></b>
    		<?php
    			/**
    			 * woocommerce_shop_loop_item_title hook.
    			 *
    			 * @hooked woocommerce_template_loop_product_title - 10
    			 */
    			do_action( 'woocommerce_shop_loop_item_title' );
    		?>
    	<b></a></b>
    	<?php
    	/**
    	 * woocommerce_after_shop_loop_item_title hook.
    	 *
    	 * @hooked woocommerce_template_loop_rating - 5
    	 * @hooked woocommerce_template_loop_price - 10
    	 */
    	<b>do_action( 'woocommerce_after_shop_loop_item_title' );</b>
    
    	/**
    	 * woocommerce_after_shop_loop_item hook.
    	 *
    	 * @hooked woocommerce_template_loop_product_link_close - 5
    	 * @hooked woocommerce_template_loop_add_to_cart - 10
    	 */
    	<b>do_action( 'woocommerce_after_shop_loop_item' );</b>
    	?>
    	</div>
    </div>
    </div>

    Первым делом я убрал ссылки с <?php the_permalink(); ?>, т. к. карточка товара не нужна совсем. Да, изящнее было бы разобраться и заменить на функцию, выводящую нужные мне ссылки, но времени на это, увы, нет.

    Далее - убрал do_action( 'woocommerce_after_shop_loop_item_title' ); и do_action( 'woocommerce_after_shop_loop_item' ); , т. к. рейтинг, цена и кнопка "В корзину" мне опять же не нужны.

    Ссылки на сайты фабрик я разместил в short description соответственно в каждом товаре в виде
    <a href="http://www.ararredamenti.it/" rel="noopener" target="_blank">www.ararredamenti.it</a>
    (Excel в помощь). Соответственно теперь нужно добавить хук, который выводил бы нам short description.

    Для этого в файле /wp-content/plugins/woocommerce/includes/wc-template-hooks.php добавляем
    /**
     * Ссылки на фабрики в /shop.
     */
    add_action( 'woocommerce_brands_link', 'woocommerce_template_single_excerpt', 10 );

    Вот эту штуку - 'woocommerce_template_single_excerpt', я подглядел в шаблоне карточки товара content-single-product.php темы - заметил, что это часть хука, выводящая информацию по товару.

    Далее добавляем этот хук в content-product.php темы после хука заголовка товара, в итоге получилось вот так:
    Изменённый content-product.php
    <?php
    
    if ( ! defined( 'ABSPATH' ) ) {
    	exit; // Exit if accessed directly
    }
    
    global $product, $woocommerce_loop;
    
    // Ensure visibility
    if ( empty( $product ) || ! $product->is_visible() ) {
    	return;
    }
    
    // Store column count for displaying the grid
    if ( empty( $woocommerce_loop['columns'] ) ) {
    	$woocommerce_loop['columns'] = apply_filters( 'loop_shop_columns', 3 );
    }
    
    // Extra post classes
    $classes = array();
    if ($woocommerce_loop['columns'] == 2) {
    	$classes[] = 'col-md-6';
    }elseif($woocommerce_loop['columns'] == 4){
    	$classes[] = 'col-md-3';
    }elseif($woocommerce_loop['columns'] == 6){
    	$classes[] = 'col-md-2';
    }else{
    	$classes[] = 'col-md-4';
    }
    ?>
    <div <?php post_class( $classes ); ?>>
    <div class="product-item">
    	<?php
    	/**
    	 * woocommerce_before_shop_loop_item hook.
    	 *
    	 * @hooked woocommerce_template_loop_product_link_open - 10
    	 */
    	do_action( 'woocommerce_before_shop_loop_item' );
    	?>
    
    	<?php
    	/**
    	 * woocommerce_before_shop_loop_item_title hook.
    	 *
    	 * @hooked woocommerce_template_loop_product_thumbnail - 10
    	 * @hooked woocommerce_show_product_loop_sale_flash - 10
    	 */
    	do_action( 'woocommerce_before_shop_loop_item_title' );
    	?>
    
    	<div class="product-info">
    		<?php
    			/**
    			 * woocommerce_shop_loop_item_title hook.
    			 *
    			 * @hooked woocommerce_template_loop_product_title - 10
    			 */
    			do_action( 'woocommerce_shop_loop_item_title' );
    			do_action( 'woocommerce_brands_link' );
    		?>
    	<?php
    
    	?>
    	</div>
    </div>
    </div>

    В итоге - то, что нужно
    Скрин результата
    5c373da3449f0917367287.png

    Знаю, что реализация далека от the best. С php знаком только на уровне вот такого редкого ковыряния тем и плагинов. В силу этого ни в коем случае не претендую на экспертное мнение. Надеюсь, будет полезно тем, кто так же, как и я, искал способ решения такой задачи, т. к. теперь могу сразу добавить 300 фабрик на сайт импортом из Excel
    Ответ написан
    1 комментарий
  • Не работает форма обратной связи, сайт на html без цмс, js присутствует. Если так не можете подсказать я оплачу время поможите?

    Zheleznov
    @Zheleznov
    #/ Front / Back / DevOps /#
    1) Нужно создать файл mail.php , с кодом
    <?php
    $name = $_POST['name'];
    $email = $_POST['email'];
    $phone = $_POST['phone'];
    $message = $_POST['message'];
    
    $name = htmlspecialchars($name);
    $email = htmlspecialchars($email);
    $phone = htmlspecialchars($phone);
    $message = htmlspecialchars($message);
    
    $name = urldecode($name);
    $email = urldecode($email);
    $phone = urldecode($phone);
    $message = urldecode($message);
    
    $name = trim($name);
    $email = trim($email);
    $phone = trim($phone);
    $message = trim($message);
    
    if (mail("SVOYU_POCHTU@mail.ru", "Заявка с сайта", "Телефон: ".$phone." Сообщение: ".$message. "ФИО:".$name.". E-mail: ".$email ." . From: SVOYU_POCHTU@mail.ru \r\n"))
     {     echo "сообщение успешно отправлено";
    } else {
        echo "при отправке сообщения возникли ошибки";
    }?>


    Закинуть этот файл в корневую папку сайта:
    /fsi.org.ua/
    или
    /fsi.org.ua/public_html/
    на каждом хостинге по-разному

    2) У вас на странице /startup.html есть форма обратной связи
    - Форма https://habrastorage.org/webt/sf/gd/jr/sfgdjr-gw6l...
    - Её код https://habrastorage.org/webt/8c/td/x5/8ctdx5mxl85...
    - В этом месте надо добавить метод POST - https://habrastorage.org/webt/io/a2/ax/ioa2ax5_io0...
    <form action="mail.php" method="POST" class="form contacts-form">

    сейчас он не прописан, именно метода пост, нету

    После этого должно всё работать
    больше ничего нигде подключать не надо
    я эту форму и этот скрипт себе на сайт закидывал, всё отправляется)
    Ответ написан
    Комментировать
  • Есть ли скрипт таймера обратного отсчета который бы обновлялся к примеру каждые три дня?

    Zheleznov
    @Zheleznov
    #/ Front / Back / DevOps /#
    Здесь хорошая библиотека - hilios.github.io/jQuery.countdown
    Ответ написан
    Комментировать
  • Не запускается Browser-Sync. При открытии выдает ошибку?

    Zheleznov
    @Zheleznov
    #/ Front / Back / DevOps /#
    Попробуй перейти в папку ..\node_modules\browser-sync\dist
    Там должен быть файл default-config.js

    через поиск найди строку: open: "local",
    обычно 286 строка

    и смени на : open: "false",

    Если не поможет, не забудь сменить обратно
    Ответ написан
    Комментировать
  • Как вывести все посты категории кроме первых трёх WordPress?

    Zheleznov
    @Zheleznov Автор вопроса
    #/ Front / Back / DevOps /#
    Правильный вариант

    <?php
      $ppp = 4;
      $current = $query->current_post + 1;
      $loop = new WP_Query( array(
        'posts_per_page' => $ppp,
        'offset'=> 3
      ) ); ?>
      <?php if ( $loop->have_posts() ) { ?>
     
     
      <?php while ( $loop->have_posts() ) { $loop->the_post() ?>
        <?php include 'parts/item.php'; ?>
      <?php } ?>
     
     
    <?php  ?>


    Разобрался, всем спасибо!
    Ответ написан
    Комментировать
  • Угловая рамка. Как сделать чтобы небольшая рамка была только по углам div-а?

    Сделал псевдо-элементами
    https://codepen.io/UMirlan/pen/vYxEKBP
    Ответ написан
    Комментировать
  • Как проскроллить страницу до нужного элемента (ярлыка) с помощью Javascript (jQuery)?

    Zheleznov
    @Zheleznov
    #/ Front / Back / DevOps /#
    const anchors = document.querySelectorAll('a[href*="#"]')
    
            for (let anchor of anchors) {
              anchor.addEventListener('click', function (e) {
                e.preventDefault()
    
                const blockID = anchor.getAttribute('href').substr(1)
    
                document.getElementById(blockID).scrollIntoView({
                  behavior: 'smooth',
                  block: 'start'
                })
              })
            }
    Ответ написан
    2 комментария
  • Как сделать переадресацию на адрес включающий родительскую категорию только при отсутствии таковой?

    @dodo512
    RewriteRule ^subcategory/.+$ https://site.ru/parent-category/$0 [R=301,L]

    Ставить в начало файла сразу после RewriteEngine on
    Ответ написан
    Комментировать
  • Как настроить переадресацию для пагинации на сайте через .htaccess?

    @dodo512
    RewriteCond %{QUERY_STRING} (?:^|&)page=(\d+)
    RewriteRule ^(.+)/$ http://site/$1?p=%1 [R=301,L]

    Ставить в начало файла сразу после RewriteEngine on
    Ответ написан
    Комментировать
  • Как объединить дочерние элементы в один родительский, используя SimpleXML?

    roswell
    @roswell
    и швец, и жнец, и на дуде игрец
    $input = new SimpleXMLElement(/* ... */);
    foreach ($input->xpath('//product') as $product) {
        foreach ($product->xpath('properties/property') as $i => $property) {
            $product->addChild('property' . ($i + 1), $property->name->__toString() . ':' . $property->value->__toString());
        }
        unset($product->properties);
    }
    Ответ написан
    2 комментария
  • Как вычислить одинаковые значения в массиве и получить ключи этих совпадающих значений кроме исходного?

    0xD34F
    @0xD34F
    $vals = [];
    $keys = [];
    
    foreach ($arr as $key => $val) {
      if (isset($vals[$val])) {
        $keys[] = $key;
      }
      $vals[$val] = 1;
    }
    Ответ написан
    Комментировать
  • Как переустановить mysql в vestacp?

    zooks
    @zooks
    Frontend
    Удаление и замена на MariaDB. Базы данных при этом сохраняются.
    sudo apt-get remove --purge mysql-server mysql-client mysql-common
    sudo apt-get autoremove
    sudo apt-get autoclean
    sudo apt-get install mariadb-server

    Но в вашем случае (когда мало понимания что происходит) рекомендую восстановить из бекапа весь VDS. Если прошло не слишком много времени, то хостер поможет вам это сделать.
    Ответ написан
    Комментировать
  • Сайт на http/2. Как открывать определенные страницы через http/1.1?

    kotomyava
    @kotomyava
    Системный администратор
    В nginx, на уровне location невозможно выбрать протокол, только на уровне всего виртуального хоста(а на самом деле, даже порта, если не исправили ещё). Так что, либо откатываться полностью на http 1.1, либо мириться с проблемой.
    Ответ написан
    2 комментария
  • VestaCP на 8083 порте. Как используя субдомен получить доступ к ПУ?

    TemaSM
    @TemaSM Автор вопроса
    Fullstack, DevOps, InfSec
    UPD: ВНИМАНИЕ. Ответ был написан очень давно, многое поменялось с тех пор. Ответ скорее всего более не актуален.

    Все, 5 часов мучения вылились в отличный результат!
    Как я сделал:

    1)Идем в админку VestaCP в раздел WEB, редактируем основной домен(например domain.ru) и добавляем алиас вида: panel.domain.ru (вместо panel укажите путь, по которому при заходе Вы будете видеть VestaCP)
    2)Заходим в раздел DNS и проверяем записи этого же домена. Обязательно должна быть A запись с именем, которое Вы вводили до этого!
    3)Идем по пути /etc/nginx/conf.d/ - там будет файл вида 127.0.0.1.conf (только там ip вашего сервера) - очищаем содержимое этого файла и сохраняем.
    4)Далее идем по пути /usr/local/vesta/nginx/conf/ - там будет файл nginx.conf - открываем и редактируем:
    После # Vhost будет стоять блок виртуального хоста, примерно такой:
    server {
    	listen       	8083;
    	server_name     _;        
            root            /usr/local/vesta/web;
            charset         utf-8;


    Заменяем его на:
    server {
    	listen       	panel.domain.ru:80;
    	server_name     panel.domain.ru;        
            root            /usr/local/vesta/web;
            charset         utf-8;


    Теперь выше этого кода, но после # Vhost, добавляем это:
    server {
    		listen       domain.ru:80 default;
    		server_name  domain.ru;		
    		location / {
    			proxy_pass  http://domain.ru:8080;
    		}
    		}

    domain.ru - Меняйте на тот домен, для которого выставляли A запись в DNS разделе(он же и в WEB разделе)

    Теперь поясняю:
    С этого момента запросы к главному домену - основной nginx не обрабатывает, а родительский(в VestaCP) делает это именно так как нам необходимо!
    При заходе на domain.ru nginx перенаправляет нас на 8080 порт, который принимает пакеты и отображает нам содержимое.
    При заходе на panel.domain.ru nginx принимает запросы и выполняет их относительно Location'ов, которые выставлены ниже в файле конфигурации.

    Таким образом мы "убили сразу двух зайцев":
    1)Как бы переместили нашу панель на субдомен
    2)Везде в запросах убрали какие либо порты

    Всех благодарю за помощь!
    Ответ написан
    3 комментария
  • Как заменить самоподписанный SSL-сертификат VestaCP на нормальный от letsencrypt?

    @altai2013 Автор вопроса
    Пока что нашёл такое решение (буду рад, если кто-то предложит варианты лучше): пишем скрипт, который будет ежедневно выполняться и копировать в папку с самоподписанным SSL-сертификатом VestaCP другой наш SSL-сертификат, полученный для доменного имени.

    1) Создаём в папке /etc/cron.daily/ файл под именем vesta_ssl:
    nano /etc/cron.daily/vesta_ssl

    2) пишем в файл скрипт и сохраняем его, предварительно заменив [USER] на имя пользователя, создававшего домен в VestaCP (например admin) и заменив [DOMAIN] на доменное имя, для которого получен валидный SSL-сертификат (например mydomain.com):
    #!/bin/bash
    
    cert_src="/home/[USER]/conf/web/ssl.[DOMAIN].pem"
    key_src="/home/[USER]/conf/web/ssl.[DOMAIN].key"
    cert_dst="/usr/local/vesta/ssl/certificate.crt"
    key_dst="/usr/local/vesta/ssl/certificate.key"
    
    if ! cmp -s $cert_dst $cert_src
    then
            # Copy Certificate
            cp $cert_src $cert_dst
    
            # Copy Keyfile
            cp $key_src $key_dst
    
            # Change Permission
            chown root:mail $cert_dst
            chown root:mail $key_dst
    
            # Restart Services
            service vesta restart &> /dev/null
            service exim4 restart &> /dev/null
    fi


    3) делаем скрипт исполняемым файлом:
    chmod +x /etc/cron.daily/vesta_ssl

    4) запускаем скрипт вручную, чтобы применить его немедленно, не дожидаясь расписания cron:
    ./vesta_ssl
    Ответ написан
    Комментировать
  • Картинки через https?

    dimonchik2013
    @dimonchik2013
    non progredi est regredi
    глюк или криворук
    Ответ написан
    Комментировать
  • Как отсортировать строки по значению и вывести последнее?

    bubandos
    @bubandos
    bash'у, javascript'ую, php'лю, css'аю, html'каю
    SELECT `id_order`, MAX(  `id_order_history` ) 
    FROM  `table_name` 
    GROUP BY  `id_order`;
    Ответ написан
    Комментировать
  • Как при обновлении одного значения в таблице сделать обновление другого, так чтобы обновляемое значение было числом с -10 от первого?

    Измените тригер на BEFORE UPDATE и просто выставляйте новое значение перед изменением.
    CREATE TRIGGER update_test BEFORE UPDATE ON test_table
    FOR EACH ROW
    BEGIN
    IF NEW.quantity <> OLD.quantity THEN
      SET NEW.quantity_stock = NEW.quantity - 10;
    END IF;
    END;
    Ответ написан
    Комментировать