• Как правильно редактировать файлы WP(стили, скрипты, статику)?

    AntonLitvinenko
    @AntonLitvinenko
    HTML coder
    Первое, что нужно сделать если тема не ваша это создать и активировать дочернюю тему.
    https://wp-kama.ru/id_6235/dochernie-temy-wordpres...
    Она состоит из файла стилей, и файла функций. Единственный обязательный это файл стилей. Он перезаписывает основной файл, поэтому стили базовой темы нужно либо заинклюдить в него либо подключить в файле функций, что более правильно. Файл функций дополняет основной файл функций и запускается раньше.
    Кастомные стили оптимально писать в дочернем файле стилей. Если стиль не сработал, смотрим в отладчике применился ли он вообще, возможно ему просто не хватает веса селектора чтобы перебить, тогда усиливаем селектор.
    В дочерней теме можно переопределить любые шаблоны разметки. Если нужно изменить хедер, копируем по тому же пути файл хедера в дочернюю тему и там уже правим.
    Некоторые функции тоже можно переопределить, только если автор функции в базовой теме завернул её в специальную конструкцию проверки
    Ответ написан
    Комментировать
  • Редактирование CSS кода в WP?

    AntonLitvinenko
    @AntonLitvinenko
    HTML coder
    В элементоре практически каждому блоку можно назначить свой класс. Посмотреть к какому именно блоку применился класс можно в инспекторе. Да и в целом можно назначить родительский класс, а потом в инспекторе смотреть классы вложенных блоков и наследуясь от базового назначенного оформлять вложенные
    Ответ написан
    2 комментария
  • Как вывести минимальную цену товаров в категории?

    AntonLitvinenko
    @AntonLitvinenko
    HTML coder
    function wpq_get_min_price_per_product_cat( $term_id ) {
    
    	global $wpdb;
    
    	$sql = "
    	SELECT MIN( meta_value+0 ) as minprice
    	FROM {$wpdb->posts}
    	INNER JOIN {$wpdb->term_relationships} ON ({$wpdb->posts}.ID = {$wpdb->term_relationships}.object_id)
    	INNER JOIN {$wpdb->postmeta} ON ({$wpdb->posts}.ID = {$wpdb->postmeta}.post_id)
    	WHERE
    	( {$wpdb->term_relationships}.term_taxonomy_id IN (%d) )
    		AND {$wpdb->posts}.post_type = 'product'
    		AND {$wpdb->posts}.post_status = 'publish'
    		AND {$wpdb->postmeta}.meta_key = '_price'
    	";
    
    	return $wpdb->get_var( $wpdb->prepare( $sql, $term_id ) );
    }
    
    
    function wpq_after_subcategory( $category ) {
    	if( function_exists( 'wpq_get_min_price_per_product_cat' ) ) {
    		printf( "%s pricing starts at %s ", $category->name, wpq_get_min_price_per_product_cat( $category->term_id ) );
    	}
    }
    add_action( 'woocommerce_after_subcategory', 'wpq_after_subcategory' );
    Ответ написан
    8 комментариев
  • Вывод категорий с постами?

    AntonLitvinenko
    @AntonLitvinenko
    HTML coder
    Вроде помогло, оформлю в ответ, мошт ещё кому поможет
    $terms_array = array( 
      'taxonomy' => 'services', // you can change it according to your taxonomy
      'parent'   => 0 // If parent => 0 is passed, only top-level terms will be returned
    );
    $services_terms = get_terms($terms_array); 
    foreach($services_terms as $service): ?>
    <h4><?php echo $service->name; ?></h4>
    <?php 
    $post_args = array(
          'posts_per_page' => -1,
          'post_type' => 'service', // you can change it according to your custom post type
          'tax_query' => array(
              array(
                  'taxonomy' => 'services', // you can change it according to your taxonomy
                  'field' => 'term_id', // this can be 'term_id', 'slug' & 'name'
                  'terms' => $service->term_id,
              )
          )
    );
    $myposts = get_posts($post_args); ?>
    <ul>
    <?php foreach ( $myposts as $post ) : setup_postdata( $post ); ?>
      <li>
        <a href="<?php the_permalink(); ?>"><?php the_title(); ?></a>
      </li>
    <?php endforeach; // Term Post foreach ?>
    </ul>
    <?php wp_reset_postdata(); ?>
    
    <?php endforeach; // End Term foreach; ?>
    Ответ написан
    4 комментария
  • Как изменить повторяющийся блок в WordPress через админку?

    AntonLitvinenko
    @AntonLitvinenko
    HTML coder
    Для ACF Pro.
    Первый вариант. Для конкретного этого блока можно завести поля на странице опций, опции сквозные и могут выводится везде на сайте.
    Второй вариант. Вывести в админке эти поля для какойто конкретной страницы, например для главной, если они есть, а в вашем шаблоне получать значения, передавая id ( get_fiead('some_field', $home_page_id) ), этот вариант интереснее тем, что клиенту не нужно помнить где спрятаны эти поля.
    Третий. смотря что это за поля, но например если это секция с отзывами, то бишь с сущностями, которые могут претендовать на отдельный тип записи, то можно собственно создать отдельный тип записи и выводить его стандартно циклом.
    Четвертый, похожий на третий, но тут мы создаем страницу опций ACF которую называем Отзывы, и в ней будут только эти поля.

    Предложили использовать Кастомайзер, вижу. Я пожалуй не использовал бы кастомайзер для вывода контента, опять же если есть ACF Pro, то я обычно даже для настроек базовых не использую кастомайзер, для того чтобы не дробить места расположения настроек.

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

    AntonLitvinenko
    @AntonLitvinenko
    HTML coder
    $newsLoop = new WP_Query(array(
    	'posts_per_page' => 10,
    	'post_type'      => 'post',
    	'orderby'        => 'date',
    	'order'          => 'DESC',
    	'meta_query'     => array(
    		array(
    			'key'     => 'post_delete',
    			'value'   => '0',
    			'compare' => 'LIKE',
    		)
    	),
    ));
    
    
    if ( $newsLoop->have_posts() ) : ?>
    
    	<div class="news-wrapper">
    
    		<?php while ( $newsLoop->have_posts() ) : $newsLoop->the_post();
    			$post_delete = get_post_meta( $post->ID, 'post_delete' );
    		?>
    
    		<?php if ( !$post_delete ): ?>
    			<?php get_template_part( 'template-parts/loop', get_post_format() ? : 'video' ); ?>
    		<?php endif ?>
    
    		<?php endwhile;?>
    
    	</div>
    
    <?php endif; wp_reset_query(); ?>
    Ответ написан
    1 комментарий
  • Как конвертировать все scss в css?

    AntonLitvinenko
    @AntonLitvinenko
    HTML coder
    Да не может такого быть. все шаблоны продают с css, если там есть еще и scss, то хорошо. С чего ты взял что он без css? реально купил и его там нету или тебе об этом сказал разработчик? или ты в инспекторе увидел? так то что ты увидел в инспекторе это неправда, это изза карты (чтото типа style.css.map), который создается компилятором. Браузер не хавает нескомпиленый scss

    зы.
    templates-furni.ok-cms.com/design/furniture_v1/css...
    в конце sourceMap. Прогони через бьютифай и сравни с некоторыми селекторами
    Ответ написан
    Комментировать
  • Slick для мобильных устройств?

    AntonLitvinenko
    @AntonLitvinenko
    HTML coder
    $(window).on('resize', function(e){
      // Переменная, по которой узнаем запущен слайдер или нет.
      var initLib = $('.library-slider').data('init-slider');
    
      if(window.innerWidth < 768){
        // Если слайдер не запущен
        if(initLib != 1){
          // Запускаем слайдер и записываем в data init-slider = 1
          $('.library-slider').slick({
            arrows: false,
            dots: true,
            slidesToShow: 3,
            slidesToScroll: 1,
            responsive: [
              {
                breakpoint: 576,
                settings: {
                  slidesToShow: 2,
                  slidesToScroll: 1,
                }
              },
              {
                breakpoint: 480,
                settings: {
                  slidesToShow: 1,
                  slidesToScroll: 1,
                }
              }
            ]
          }).data({'init-slider': 1});
        }
      }
      // Если десктоп
      else {
        // Если слайдер запущен
        if(initLib == 1){
          // Разрушаем слайдер и записываем в data init-slider = 0
          $('.library-slider').slick('unslick').data({'init-slider': 0});
        }
      }
    }).trigger('resize')
    Ответ написан
    Комментировать
  • Как создать пагинацию?

    AntonLitvinenko
    @AntonLitvinenko
    HTML coder
    <?php
    $paged = ( get_query_var( 'paged' ) ) ? get_query_var( 'paged' ) : 1;
    $args = array(
         'post_type' => 'custom_post_type_name',
         'posts_per_page' => 10,
         'paged' => $paged
    );
    $loop = new WP_Query( $args );
    while ( $loop->have_posts() ) : $loop->the_post();
         // CPT content
    endwhile;
    ?>
    <div class="pagination">
         <?php
         $big = 999999999;
         echo paginate_links( array(
              'base' => str_replace( $big, '%#%', get_pagenum_link( $big ) ),
              'format' => '?paged=%#%',
              'current' => max( 1, get_query_var('paged') ),
              'total' => $loop->max_num_pages,
              'prev_text' => '&laquo;',
              'next_text' => '&raquo;'
         ) );
    ?>
    </div>
    <?php wp_reset_postdata(); ?>
    Ответ написан
    Комментировать
  • Как запретить создание записи в CPT Wordpress?

    AntonLitvinenko
    @AntonLitvinenko
    HTML coder
    'capabilities' => array(
      'create_posts' => 'do_not_allow'
    ),
    'map_meta_cap' => true,
    Ответ написан
    3 комментария
  • Как исправить верстку?

    AntonLitvinenko
    @AntonLitvinenko
    HTML coder
    Это абсолютно точно письмо, если приглядеться, там куча условных тегов для почтовиков.
    Это довольно странное тестовое задание, оно подходит только человеку, который в резюме написал что он умеет верстать письма. Ты можешь быть гуру верстки, но если не сталкивался с версткой писем - никакие твои знания не помогут сверстать письмо. Только изучение новой информации и погружение в ад.
    На самом деле письма вручную мало кто верстает, для этого используются фреймворки типа Fundation или MJML. Я предпочитаю второй, хоть у него и меньше свободы.
    Если вы не верстальщик, а тем более не верстальщик писем, то вам это тестовое не сделать
    Ответ написан
    Комментировать
  • Как сделать, чтобы при добавлении в корзину товара страница не перезагружалась?

    AntonLitvinenko
    @AntonLitvinenko
    HTML coder
    Нагуглил вам рабочий код с аяксом
    /**
     * Add quantity field on the shop page.
     */
    function ace_shop_page_add_quantity_field() {
    
    	/** @var WC_Product $product */
    	$product = wc_get_product( get_the_ID() );
    
    	if ( ! $product->is_sold_individually() && 'variable' != $product->get_type() && $product->is_purchasable() ) {
    		woocommerce_quantity_input( array( 'min_value' => 1, 'max_value' => $product->backorders_allowed() ? '' : $product->get_stock_quantity() ) );
    	}
    
    }
    add_action( 'woocommerce_after_shop_loop_item', 'ace_shop_page_add_quantity_field', 12 );
    
    
    /**
     * Add required JavaScript.
     */
    function ace_shop_page_quantity_add_to_cart_handler() {
    
    	wc_enqueue_js( '
    		$(".woocommerce .products").on("click", ".quantity input", function() {
    			return false;
    		});
    		$(".woocommerce .products").on("change input", ".quantity .qty", function() {
    			var add_to_cart_button = $(this).parents( ".product" ).find(".add_to_cart_button");
    			// For AJAX add-to-cart actions
    			add_to_cart_button.attr("data-quantity", $(this).val());
    			// For non-AJAX add-to-cart actions
    			add_to_cart_button.attr("href", "?add-to-cart=" + add_to_cart_button.attr("data-product_id") + "&quantity=" + $(this).val());
    		});
    		// Trigger on Enter press
    		$(".woocommerce .products").on("keypress", ".quantity .qty", function(e) {
    			if ((e.which||e.keyCode) === 13) {
    				$( this ).parents(".product").find(".add_to_cart_button").trigger("click");
    			}
    		});
    	' );
    
    }
    add_action( 'init', 'ace_shop_page_quantity_add_to_cart_handler' );
    Ответ написан
    Комментировать
  • Как правильно сделать адаптацию?

    AntonLitvinenko
    @AntonLitvinenko
    HTML coder
    вот такие классы у карточек
    col col-md-4 col-xs-4
    во-первых col-md-4 лишний, потому что бутстрап mobile-first
    во вторых класс col автоматический, его нужно использовать осторожно, это он как хочет так и задает ширину, хотите контроль - задавайте руками, например
    col-xs-6 col-md-4/ в этом случае на больших экранах будет три карточки, на планшетах две, на мобилках одна
    Ответ написан
    Комментировать
  • Как клиенту дать возможность редактировать контент wordpress?

    AntonLitvinenko
    @AntonLitvinenko
    HTML coder
    Даже из коробки вордпресс уже оснащен подобием билдера - гутенберг. При интеграции вы должны были как минимум подготовить стандартные шаблоны для записей и страниц, в которые функцией the_content() выводится все из редактора, будь то классический или гутенберг.
    Произвольные поля позволяют редактировать контент расположеный в уже готовых сверстанных блоках, положение которых на странице можно изменить используя flexible content или кастомные блоки для гутенберга.
    Итак, если для страницы уникальная верстка и нужно разрешить редактирование только самого контента, то можно обойтись ACF. Если чуть по разнообразнее то с помощью него же использовать Flexible content. Также ACF поможет создавать блоки для гутенберга. это все про ПРО версию.
    Далее билдеры. кроме встроенных блоков, для любого билдера можно создавать кастомные шорткоды (виджеты), как указано в вопросе. Но это дело часто непростое, хотя есть варианты упрощения.
    Я чаще всего использую просто кастомные поля и кастомные типы записей, реже флексибл контент и блоки для гутенберга. Был опыт создания виджетов для Page builder by Site origin - долго и муторно. Также делал для visual composer, но в качестве настроек юзал acf
    Ответ написан
    2 комментария
  • Как в Woocommerce вывести доп.информацию о категории при наведении?

    AntonLitvinenko
    @AntonLitvinenko
    HTML coder
    Не уверен, что выйдет через стандартное меню. Даже не знаю, можно ли подобный волкер написать. Хотя можно и попробовать. Я вижу пару вариантов.
    Плагины типа мега-меню это первый.
    Второй это вывести рядом с меню скрытые блоки, в которые вытащить описания категорий с картинками, скрыть их. К нужным пунктам меню добавить классы, от которых плясать открытие блоков с описанием.

    <?php 
    
    $prod_cat_args = array(
    	'taxonomy'    => 'product_cat',
    	'hide_empty'  => false,
    	'parent'      => 0 
    );
    
    $woo_categories = get_categories( $prod_cat_args );
    
    ?>
    
    <?php foreach ( $woo_categories as $woo_cat ) : 
    	$woo_cat_id = $woo_cat->term_id;
    	$woo_cat_name = $woo_cat->name;
    	$woo_cat_slug = $woo_cat->slug;
    	$woo_cat_descr = $woo_cat->description;
    	$category_thumbnail_id = get_term_meta($woo_cat_id, 'thumbnail_id', true);
    	$thumbnail_image_url = wp_get_attachment_url($category_thumbnail_id);
    	$cat_link = get_term_link( $woo_cat_id, 'product_cat' );
    	?>
    	<div class="product-cat-item">
    		<a href="<?php echo $cat_link ?>"><?php echo $woo_cat_name ?></a>
    		<?php if ($thumbnail_image_url) : ?>
    			<img src="<?php echo $thumbnail_image_url ?>" alt="<?php echo $woo_cat_name ?>">
    		<?php endif; ?>
    		<p><?php echo $woo_cat_descr ?></p>
    	</div>
    
    <?php endforeach; ?>
    Ответ написан
    6 комментариев
  • Как в wordpress в post type убрать вывод слова архивы перед рубрикой, крошках и мета тайтле?

    AntonLitvinenko
    @AntonLitvinenko
    HTML coder
    add_filter( 'get_the_archive_title', function( $title ){
    	return preg_replace('~^[^:]+: ~', '', $title );
    });
    Ответ написан
    Комментировать
  • Как переопределить файл шаблона карточки товара woocommerce?

    AntonLitvinenko
    @AntonLitvinenko
    HTML coder
    add_action( 'after_setup_theme', 'woocommerce_support' );
    function woocommerce_support() {
      add_theme_support( 'woocommerce' );
      add_theme_support( 'wc-product-gallery-zoom' );
      add_theme_support( 'wc-product-gallery-lightbox' );
      add_theme_support( 'wc-product-gallery-slider' );
    }
    Ответ написан
    1 комментарий
  • Как сделать модальное окно на Js?

    AntonLitvinenko
    @AntonLitvinenko
    HTML coder
    есть 10 кнопок и одно модальное окно и в него в зависимости от кнопки нужно передать контент? во таком случае к каждой кнопке тем или иным образом нужно этот контент привязать, чтобы дотянуться до него через this. например 10 секций с контентом, и в каждой секции есть кнопка. получаем при нажатии кнопки ее родителя, например, секцию. далее ищем уже внутри нее контент и вставляем его в модалку
    чтото типа
    $('.open-modal-btn').on('click', function (e) {
    	e.preventDefault();
    	var $content = $(this).parents('.cf7-section').find('.cf7-content').html();//получаем родителя и ищем в нем контент
    	$('#call-to-action').find('.modal-content-wrapper').html($content); //в модалке ищем место для вставки
    	var $target = $(this).attr('data-target');
    	openModal($target);
    });
    Ответ написан
    Комментировать