• Как добавить текст между заголовком (label) и полем ввода (input) адреса в корзине woocommerce?

    Webram
    @Webram
    Я есть
    Тут можно CSS обойтись:
    label[for="billing_address_1"]:after {
        content: 'Жирное красное примечание';
        font-weight: 700;
        color: red;
        display: block;
    }

    ME5LX.png
    Ответ написан
    2 комментария
  • ACF options page + кириллица - ошибка "Извините, вам не разрешено просматривать эту страницу"?

    Была такая же проблема. Она явно связана с парсингом get-параметров при смешивании кириллицы и латиницы.

    Для решения, необходимо добавить "menu_slug" к массиву параметров acf_add_options_sub_page

    Т.е. у нас должно получиться что-то вроде:

    if( function_exists('acf_add_options_page') ) {
      
      acf_add_options_page(array(
        'page_title' => 'Настройки темы',
        'menu_title' => 'Настройки темы',
        'menu_slug'  => 'theme-general-settings',
        'capability' => 'edit_posts',
        'redirect'   => false
      ));
      
      acf_add_options_sub_page(array(
        'page_title' => 'Настройки шапки сайта',
        'menu_title' => 'Шапка,
        'parent_slug'=> 'theme-general-settings',
        'menu_slug'  => 'theme-general-header', // <= Добавить вот сюда
      ));
    }


    Если не добавлять 'menu_slug', то url редактирования sub_page получается /wp-admin/admin.php?page=acf-options-шапка и вылазит вышеуказанная ошибка.

    При добавлении 'menu_slug', url становится вида /wp-admin/admin.php?page=theme-general-header, где theme-general-header - это и есть наш menu_slug.
    Ответ написан
    1 комментарий
  • Список адресов на карте по городам + wordpress?

    artzolin
    @artzolin Куратор тега WordPress
    php, WordPress разработка сайтов artzolin.ru
    Можно реализовать с помощью api яндекс карт, вот пример как добавлять множество меток. По такому же принципу можно сделать в mapbox и, возможно, в google maps

    В WordPress создаете у типа записи мета-поле geo_location, пишите в него широту/долготу, запросом wp_query() делаете выборку записей, собираете координаты в json по шаблону из документации и передаете скрипту карты на вывод
    Ответ написан
    2 комментария
  • Фильтр товаров wordress ( НЕ woo)?

    AntonLitvinenko
    @AntonLitvinenko
    HTML coder
    greencost, Если через ajax + metaquery, то будет как-то так:
    Все фильтры завернуты в форму и представляют собой элементы формы: селекты, радиокнопки, чекбоксы. У элементов форм есть name. Обязательно должно быть скрытое поле с названием функции
    <form id="filter">
      <div class="search-holder">
        <input type="search" name="s" id="s" class="input-text" placeholder="<?php esc_attr_e( 'Поиск вакансий' ); ?>" value="<?php echo get_search_query(); ?>">
    
        <?php
        $terms_loaction = get_terms(
          array(
            'taxonomy' => 'location',
            'hide_empty' => false,
          )
        );
        ?>
    
        <?php
        if ( $terms_loaction ) :
          ?>
          <select name="city" class="select-block mobile-hide">
            <option value=""><?php esc_html_e( 'Город' ); ?></option>
            <?php
            foreach ( $terms_loaction as $location ) :
              ?>
              <option value="<?php echo esc_attr( $location->term_id ); ?>"><?php echo esc_html( $location->name ); ?></option>
            <?php endforeach; ?>
          </select>
        <?php endif; ?>
    
        <ul class="filter-list mobile-hide">
          <li>
            <label class="checkbox-block">
              <input type="checkbox" name="is_free_live">
              <span><?php esc_html_e( 'Бесплатное проживание' ); ?></span>
            </label>
          </li>
          ...
        </ul>
        <button type="submit" class="ajax-filter-btn btn"><?php esc_html_e( 'Найти вакансию' ); ?></button>
      </div>
      <input type="hidden" name="action" value="filter_vacancy">
    </form>


    php обработчик будет выглядеть как-то так:
    add_action( 'wp_enqueue_scripts', function() {
    
      $my_args = array(
        'post_type' => 'offers',
        'posts_per_page' => -1,
        'tax_query' => array(
          'relation' => 'AND',
        ),
        'meta_query' => array(
          'relation' => 'AND',
        ),
      );
    
      $my_query = new WP_Query( $my_args );
    
      wp_register_script('ajax_js', get_stylesheet_directory_uri() . '/js/ajax.js', array('jquery'), time(), true);
    
      wp_localize_script( 'ajax_js', 'ajax_obj', array(
        'ajaxurl' => admin_url('admin-ajax.php'),
        'posts' => json_encode( $my_query->query_vars ),
        'current_page' => get_query_var( 'paged' ) ? get_query_var('paged') : 1,
        'max_page' => $my_query->max_num_pages,
      ) );
    
      wp_enqueue_script('ajax_js');
    });
    
    // FILTER
    function filter_vacancy(){
    
      $args = array(
        'post_type' => 'offers',
        'posts_per_page' => -1,
        'tax_query' => array(
          'relation' => 'AND',
        ),
        'meta_query' => array(
          'relation' => 'AND',
        ),
      );
    
      if( !empty( $_POST['city'] ) && $_POST['city'] ) {
        $args['tax_query'][] = array(
          'taxonomy' => 'location',
          'field' => 'id',
          'terms' => $_POST['city'],
        );
      }
    
      if( isset( $_POST['is_free_equipment'] ) && $_POST['is_free_equipment'] ) {
        array_push($args['meta_query'][] = array(
            'key'         => 'is_free_equipment',
            'value'       => true,
            'compare'     => '=',
          )
        );
      }
    
      if( !empty( $_POST['s'] ) ) {
        $args['s'] = sanitize_text_field($_POST['s']);
      }
    
      query_posts( $args );
    
      global $wp_query;
    
      if ( have_posts() ) :
        ob_start();
    
        while ( have_posts() ) :
          the_post();
          get_template_part( 'template-parts/offers/offers', 'list' );
        endwhile;
        $response = ob_get_contents();
        ob_end_clean(); 
      else:
        $response = 'По запросу нет вакансий';
      endif;
    
      echo json_encode( array(
        'posts'       => json_encode( $wp_query->query_vars ),
        'max_page'    => $wp_query->max_num_pages,
        'found_posts' => $wp_query->found_posts,
        'content'     => $response,
      ) );
      die();
    }
    add_action('wp_ajax_filter_vacancy', 'filter_vacancy');
    add_action('wp_ajax_nopriv_filter_vacancy', 'filter_vacancy');


    ajax обработчик в упрощенном виде както так
    $('#filter').on('submit', function (e) {
      e.preventDefault();
      var filter = $(this);
      $.ajax({
        type: 'POST',
        url: ajax_obj.ajaxurl,
        data: filter.serialize(),
        dataType : 'json',
        beforeSend: function(xhr){
    
        },
        success: function (data) {
          $('.offers-list').html(data.content);
          ajax_obj.posts = data.posts;
        },
      });
    });
    Ответ написан
    Комментировать
  • Почему не работает gulp-imagemin?

    @Anarhi9_16
    Новая версия imagemin почему то не работает через requare(), поэтому вам нужно переписать код используя import и export.
    import gulp from 'gulp'
    import imagemin from 'gulp-imagemin'
    import concat from 'gulp-concat'
    import sync from 'browser-sync'
    const browserSync = sync.create();
    import uglify from 'gulp-uglify-es'
    и так далее.
    Далее все функции оставляете как есть, только перед внутренними методами src, dest, watch, parallel, serises дописуете gulp, то есть где у вас src пишете gulp.src и т.д.
    Чтобы экспортировать функцию для запуска с терминала, вместо exports.styles = styles пишете export const stylesRun = styles. Теперь функция styles доступна к выполнению через терминал командой gulp stylesRun. И т.д
    И самое главное, что бы это все работало, в файле package.json должно быть прописано свойство "type": "module", как в выложенном файле ТС:
    {
    "name": "gulp-start",
    "version": "1.0.0",
    "description": "",
    "main": "index.js",
    "type": "module", <-----вот сдесь
    "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
    },
    Вроде все доступно изложил...
    Ответ написан
    Комментировать
  • Как реализовать ссылку с номер whatsapp на сайте?

    Добавлю новостей из 2к21 :)

    Вот такую ссылку можно вставить на сайт:
    https://api.whatsapp.com/send/?phone=79200000000
    или её короткий вариант:
    https://wa.me/79200000000

    Такая же ссылка, но с текстом:
    https://api.whatsapp.com/send/?phone=79200000000&text=Здравствуйте%2C+у+меня+есть+вопрос

    или короткий вариант:
    https://wa.me/79200000000?text=Здравствуйте%2C+у+меня+есть+вопрос

    .
    Но есть другой вариант - поставить на сайт виджет CHAT-BAR - это ссылки на мессенджеры, соц.сети и телефон, которые открываются прямо в приложениях на телефоне. Можно написать свой Call-to-action и поставить ссылку на Ватсап, Вайбер, Инстаграм, Ютуб и т.п. посмотрите здесь https://skobelkin.ru/
    Вот плюсы виджета:
    • Виджет бесплатный
    • Все ссылки открываются сразу в приложениях на Андроиде и iOS правильно
    • Конвертирует мобильный трафик в подписчиков
    • Позволяет быстро связаться с компанией по любым средствам связи

    ---------------------
    Есть конструкторы ссылок для Ватсап, выбирайте:
    https://cli.co/US-49CH
    https://cli.co/Hsi6gZv
    https://cli.co/hvBtrev
    Ответ написан
    1 комментарий
  • Два вопроса по БЭМ - как называть и выносить ли отдельно класс container?

    Get-Web
    @Get-Web
    Front-End Developer
    .header-top и .header-lower

    Так лучше не делать. Старайтесь не использовать прилагательные. Смысл БЭМ в переиспользовании и то что сегодня было вверху, может оказаться внизу и наоборот, после таких преобразований, когда top окажется где-то в центре как минимум возникнет диссонанс.
    Логичнее вынести в 2 независимых блока, прекрасно подойдут названия такие как panel, bar, info, navigation, если хотите зарезервировать эти имена для других целей, то можно использовать префиксы и сочетания ibar, i-bar, info-panel. Оба эти блока можно обернуть в единый header и миксовать class="header__panel panel", хотя я бы их полностью разделил, так как верхняя панель, явно может быть переиспользована где-то в футере.

    2) Есть любой блок, у которого структура по своей сути - это container > row > col*(items). Как лучше её организовать с т.з. БЭМ?

    Тут нужно видеть с чем работать, но в таком контексте лучше использовать микс:
    <div class="news">
      <div class="news__container container">
        <div class="news__row row">
          <div class="news__item">
            <!-- контент -->
          </div>
        </div>
      </div>
    </div>

    Таким образом мы можем модифицировать row и container в контексте необходимого блока и понимать назначение классов.
    Ответ написан
    3 комментария
  • Как сверстать такой блок?

    RAX7
    @RAX7
    Либо упороться в тригонометрию и сделать через css transform + немного js

    либо использовать svg маски
    Ответ написан
    Комментировать
  • Как сверстать такой блок?

    @Shagfey
    FullStack JS developer
    Привет!

    Я бы сделал div с background картинкой для заднего фона и поверх него добавлял бы меню, телефон и форму заявки. Этот div ты сделаешь absolute и назначишь ему z-index: отрицательное значение, чтобы блок был всегда сзади других элементов. Благодаря этому ты сможешь установить и белый фон и прозрачный. Блок с картинкой механизмов можно спозиционировать с помощью absolute.
    Ответ написан
    Комментировать
  • Самый правильный цикл WP? Что и когда использовать?

    HeadOnFire
    @HeadOnFire
    PHP, Laravel & WordPress Evangelist
    Вы немножко запутались, have_posts() это не цикл, а метод объекта WP_Query, проверка если ли посты в текущем экземпляре WP_Query, независимо от того как данный экземпляр был вызван/создан - это основной запрос или произвольный. Что касается запросов, то все просто:

    1. Есть основной запрос, который по умолчанию в WP всегда выполняется. Всегда в первую очередь смотрим, можно ли добиться нужного результата путем его модификации через хук pre_get_posts. В большинстве случаев именно этим путем решается задача. Например, изменить количество постов на страницу на главной или в рубриках.

    2. Если кроме основного запроса нужен дополнительный, например у вас на главной есть уже стандартный запрос, который выводит последние записи, а вы хотите еще отдельно вывести записи произвольного типа (например, вопросы из FAQ), то используете WP_Query. В принципе, в большинстве случае если нужен отдельный от основного цикл / набор постов - используйте WP_Query. Но важно помнить, что в зависимости от задачи вы можете передать несколько важных параметров, которые повлияют на скорость. Например, по умолчанию WP_Query выполняет CALC_FOUND_ROWS (подсчет всего найденных строк), который нужен для пагинации. Если вам нужно всего лишь получить X постов, используйте параметр 'no_found_rows' => true в комбинации с указанием четкого количества постов в параметре posts_per_page - в этом случае общее количество не будет считаться. Также, по умолчанию WP_Query запрашивает таксономии и метаданные ко всем постам, и кеширует их. Это тоже можно отключать. Также, при выполнении WP_Query может быть затронут плагинами через фильтры - например posts_where (WHERE clause в MySQL). Еще важно понимать, что вызов new WP_Query возвращает новый объект WP_Query, по которому можно выполнить Loop с помощью while ( have_posts() ) : the_post() - в этом случае посты в итерации цикла будут попадать в глобальный scope.

    3. get_posts - это как шорткат на WP_Query с определенными предустановленными параметрами. Если нужно просто получить несколько постов по каким-то параметрам - используйте эту функцию. Первое, и основное - эта функция внутри вызывает именно new WP_Query. Второе - эта функция возвращает массив постов (объектов WP_Post). Третье - эта функция вызывает WP_Query c предустановленными параметрами no_found_rows (не считать общее количество постов, соответствующих параметрам) и suppress_filters (что отключает все фильтры над запросом кроме pre_get_posts). Вот и вся разница.

    4. query_posts - никогда, НИКОГДА, ни при каких обстоятельствах не использовать данную функцию. Считайте, что ее не существует. Точка.
    Ответ написан
    Комментировать
  • Простой ручной деплой из git на виртуальный хостинг?

    Robur
    @Robur
    Знаю больше чем это необходимо
    Собирайте локально, и вместо того чтобы заходить на сервер по ssh, отправляйте туда уже собранное через scp/rsync.
    Зачем пушить это в гит чтобы тут же пойти и оттуда достать?
    Ответ написан
    2 комментария
  • Какой посоветуете стартер-кит для верстки?

    RedEagle69
    @RedEagle69
    Html-верстальщик, Front-end разработчик
    Webpack + Gulp, шаблонизатор Twig и препроцессор Sass(с Scss синтаксисом). И поддержка многих новых возможностей с помощью PostCss.
    Заточен под вёрстку, полный фарш с минифаерами, сборкой спрайтов, оптимизацией картинок, шрифты, js, и куча полезных миксинов для стилей.

    Всё настраиваемо и интуитивно понятно, плюс подробный readme. Посмотреть можно
    вот здесь.
    Ответ написан
  • Ленивая подгрузка страниц во всплывающем окне?

    wppanda5
    @wppanda5 Куратор тега WordPress
    WordPress Mедведь
    $(document).on('click', '.open-modal-button', function (e) {
            $.ajax({
                //бла бла бла
            });
        })
    Ответ написан
    1 комментарий