Задать вопрос
  • Как внести в базу WooComerce кастомные типы поста?

    @zordq Автор вопроса
    В системе WP невозможно переназначить тип продукта, но это было и не нужно.
    Мною был совершен экспорт через WP All Export моего кастомного набора полей для будущих товаров. Далее данный файл экспорта CSV я открыл в Google Sheets, так как Excel их ломает и для каждого нужного мне поля, которое должно быть перенесено я задал загловок, в виде meta:size -

    60b3d5d8efdd8282741270.png

    После чего, я создал еще один тип (либо можно переименовать старый) групп полей для, уже, товаров. С теми же "направлениями". После чего в базу товаров я импортировал мой файл с полями типа meta: и на этапе импорта мои поля автоматически подтянулись как мета-данные. Когда я закончил импорт, мои кастомные поля для типа "товар" уже были заполненые моими мета-данными и шаблон продукта подтянул при помощи the_field() нужные мне данные из полей, в которых уже новые данные из импорта для типа "товар".

    Все query() и loop() в моем проекте были рабочими, так как после удаления моего кастомного типа поста "projects", тип "товар" стал по умолчанию типом "post" и всё стало работать как прежде, только уже с учетом новых _id и данными для _price.
    Ответ написан
    Комментировать
  • Кастомизация осей в highcharts.js?

    @zordq Автор вопроса
    Вот конфиг, который мне удалось сформировать для получения такого результата, как выше на скриншоте. Максимально возможное соответствие.

    Highcharts.chart('highcharts', {
        chart: {
            height: (9 / 16 * 100) + '%',
            type: 'areaspline',
            color: {
                linearGradient: {
                    x1: 0,
                    x2: 0,
                    y1: 0,
                    y2: 1
                },
                stops: [
                    [0, 'rgba(23, 64, 255, 0.1)'],
                    [1, 'rgba(23, 64, 255, 0']
                ]
            },
            style: {
                fontFamily: 'Roboto, sans-serif',
            },
            marker: {
                enabled: false
            },
            enableMouseTracking: false,
            legend: {
                enable: false
            },
            color: {
                linearGradient: {
                    x1: 0,
                    x2: 0,
                    y1: 0,
                    y2: 1
                },
                stops: [
                    [0, 'rgba(23, 64, 255, 0.1)'],
                    [1, 'rgba(23, 64, 255, 0']
                ]
            },
        },
    
        title: {
            text: null,
            align: 'left',
            style: {
                fontFamily: 'Roboto, sans-serif',
                fontSize: '16px',
                fontWeight: 'bold'
            }
        },
        tooltip: {
            enabled: false
        },
        credits: {
            enabled: false
        },
        yAxis: {
            min: 0,
            max: 100,
            title: false,
            tickInterval: 20,
            legend: {
                enabled: false
            },
            labels: {
                formatter() {
                    return this.value + "%"
                }
            }
        },
        xAxis: {
            type: 'datetime',
            title: false,
            gridLineWidth: 1,
            showEmpty: true,
            legend: false,
            dateTimeLabelFormats: {
                day: {
                    main: '%H %M'
                },
            },
            tickInterval: 7200 * 1000,
        },
        lineColor: '#1740FF',
        lineWidth: 3,
        plotOptions: {
            area: {
                fillColor: {
                    linearGradient: {
                        x1: 0,
                        y1: 0,
                        x2: 0,
                        y2: 1
                    },
                    stops: [
                        [
                            0,
                            'rgba(23, 64, 255, 0.1)'
                        ],
                        [
                            1,
                            'rgba(23, 64, 255, 0)'
                        ]
                    ]
                },
                lineColor: '#1740FF',
                lineWidth: 3,
                states: {
                    hover: {
                        enabled: false
                    }
                },
            }
        },
        series: [{
            lineColor: '#1740FF',
            lineWidth: 3,
            showInLegend: false,
            type: 'areaspline',
            marker: {
                enabled: false
            },
            enableMouseTracking: false,
            legend: {
                enable: false
            },
            color: {
                linearGradient: {
                    x1: 0,
                    x2: 0,
                    y1: 0,
                    y2: 1
                },
                stops: [
                    [0, 'rgba(23, 64, 255, 0.1)'],
                    [1, 'rgba(23, 64, 255, 0']
                ]
            },
            data: [
                [new Date('2017-01-03T00:00:00Z').getTime(), 20],
                [new Date('2017-01-03T02:00:00Z').getTime(), 50],
                [new Date('2017-01-03T02:30:00Z').getTime(), 80],
                [new Date('2017-01-03T02:35:00Z').getTime(), 70],
                [new Date('2017-01-03T03:35:00Z').getTime(), 60],
                [new Date('2017-01-03T03:36:00Z').getTime(), 20],
                [new Date('2017-01-03T04:34:00Z').getTime(), 50],
                [new Date('2017-01-03T04:55:00Z').getTime(), 80],
                [new Date('2017-01-03T05:35:00Z').getTime(), 70],
                [new Date('2017-01-03T05:55:00Z').getTime(), 60],
                [new Date('2017-01-03T06:00:00Z').getTime(), 20],
                [new Date('2017-01-03T06:56:00Z').getTime(), 50],
                [new Date('2017-01-03T07:30:00Z').getTime(), 80],
                [new Date('2017-01-03T07:45:00Z').getTime(), 70],
                [new Date('2017-01-03T08:35:00Z').getTime(), 60],
                [new Date('2017-01-03T09:36:00Z').getTime(), 20],
                [new Date('2017-01-03T10:34:00Z').getTime(), 50],
                [new Date('2017-01-03T11:55:00Z').getTime(), 80],
                [new Date('2017-01-03T12:35:00Z').getTime(), 70],
                [new Date('2017-01-03T14:55:00Z').getTime(), 60],
                [new Date('2017-01-03T16:55:00Z').getTime(), 60],
                [new Date('2017-01-03T18:55:00Z').getTime(), 60],
                [new Date('2017-01-03T20:00:00Z').getTime(), 60]
            ]
        }]
    
    });
    Ответ написан
    Комментировать
  • Проблема с PEAR + Open Server + OpenCart, ошибка в PATH?

    @zordq Автор вопроса
    Заново вытянул чистый репозиторий (всё это делал через терминал bash в webstorm, через терминал OpenServer есть нюансы). Выставил версию PHP 7.2 на сервер, после чего прописал PATH в среде Windows 10 заново. После этого установил composer ГЛОБАЛЬНО, что было ошибкой, так как не срабатывала команда composer или composer.phar, а причина была в том, что при установке composer глобальным методом в среде PATH для PHP подтирался. Заново прописал все пути. Не забывая временами проверять php -v и composer -v, чтобы убедиться, что всё выставлено верно. После этого заметил, что часть модулей и зависимостей качается заново, а какие-то берутся из кеш. Как ни странно, но, провел процедуры через терминал OpenServer и снова неудача. В общем, каким-то образом терминал на сервере упускал некоторые зависимости, даже не смотря на composer install --ignore-platform-reqs.

    После такой вот последовательности у меня всё заработало.
    Ответ написан
    Комментировать
  • Вывод конкретных записей post_type в цикле с учетом custom_fields?

    @zordq Автор вопроса
    Чтобы получить конкретные посты - делаем кастомные поля для id. Далее вводим id из urla и через get_field выводим их в нашем цикле, я использовал массив с данными и его вывод.

    Главное, что нужно использовать get_field, если будете использовать the_field - это вернет вам строку, а не массив.

    <?php
      $loop = new WP_Query([
      'post_type' => 'blogs',
      'post__in'  => [ get_field('id'), get_field('id_2'), get_field('id_3')]
      ]); ?>
      
      <?php while ($loop->have_posts()) : $loop->the_post(); ?>
        <div class="block__project blogs col-md-3 col-sm-12" style="width: 100%; height: 300px !important; padding: 0; position: relative; margin-bottom: 15px;">
          <span class="block__project_title blogs" style="position: absolute; top: 10px; bottom: auto; left: 10px; max-width: 480px;">
            <a href="<?php the_permalink(); ?>"><?php the_title(); ?></a>
          </span>
          
          <div class="blogs__template" style="height: 100%; position: relative; text-align: right;">
            <div class="" style="z-index: 2; height: 100%; width: 100%; position: absolute; background: linear-gradient(90deg, rgba(218,223,225,1) 45%, rgba(255,255,255,0) 99%);"> </div>
            <div class="ellipsis" style="position: absolute; z-index: 3; top: auto; bottom: 50px; left: 20px; max-width: 500px; max-height: 140px; overflow: hidden; text-overflow: ellipsis;"><?php the_field('post_text'); ?></div>
            <img src="<?php the_field('post_avatar'); ?>" alt="" style="height: 100%;">
          </div>
          
        </a>
        <!-- <div class="blogs__text" style="position: absolute; left: 10px; bottom: 10px; color: #000; padding: 5px; background-color: #fff; display: flex; justify-content: center; align-items: center;">
        <?php the_field('post_text'); ?>
      </div> -->
    </div>
    <?php endwhile; ?>
    Ответ написан
    Комментировать
  • Не работает анимация секций в fullpage.js + animate.css (wow.js)?

    @zordq Автор вопроса
    Плагин fullpage.js аналогичен pagepiling.js
    Второй, почему-то, работает у меня лучше и ниже представлен пример подключения и инициализации скрипта. Каждую секцию нужно описывать как в алгоритме ниже, что можно доработать, но при моём количество блоков достаточно добавить вручную каждую секцию и продиктовать её анимацию. Есть небольшая проблема при подключении файла стилей, но решается копией стилей из examples.css (pagepiling.js) в Ваш main.css (как пример).

    var deleteLog = false;
    
    		$(document).ready(function () {
    			$('#pagepiling').pagepiling({
    				menu: '#menu',
    				anchors: ['page1', 'page2', 'page3'],
    				onLeave: function (index, nextIndex, direction) {
    					if (deleteLog) {
    						$('#callbacksDiv').html('');
    					}
    					$('#callbacksDiv').append('<p>onLeave - index:' + index + ' nextIndex:' + nextIndex + ' direction:' + direction + '</p>')
    				},
    				afterRender: function () {
    					$('#callbacksDiv').append('<p>afterRender</p>');
    				},
    				afterLoad: function (anchorLink, index) {
    					$('#callbacksDiv').append('<p>afterLoad - anchorLink:' + anchorLink + " index:" + index + '</p>');
    
    					//section 2
    					if (index == 2) {
    						//moving the image
    						$('#section2').find('.intro').delay(100).animate({
    							left: '0%'
    						}, 1500, 'easeOutExpo', function () {
    							$('#section2').find('p').first().fadeIn(700, function () {
    								$('#section2').find('p').last().fadeIn(600);
    							});
    						});
    					}
    
    					//section 3
    					if (index == 3) {
    						//moving the image
    						$('#section3').find('.intro').delay(100).animate({
    							left: '0%'
    						}, 1500, 'easeOutExpo', function () {
    							$('#section3').find('p').first().fadeIn(700, function () {
    								$('#section3').find('p').last().fadeIn(600);
    							});
    						});
    					}
    
    					deleteLog = true;
    				}
    			});
    		});
    Ответ написан
    Комментировать
  • Вывод меток Yandex в кластеризатор геообъектов с помощью API-ключа?

    @zordq Автор вопроса
    Использую данную фабулу, как получить все метки в таком случае?

    <!DOCTYPE html>
    <html>
    <head>
        <title>Создание кластеризатора с произвольными иконками</title>
        <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
        <!--
            Укажите свой API-ключ. Тестовый ключ НЕ БУДЕТ работать на других сайтах.
            Получить ключ можно в Кабинете разработчика: https://developer.tech.yandex.ru/keys/
        -->
        <script src="https://api-maps.yandex.ru/2.1/?lang=ru_RU&amp;apikey=<api-ключ>" type="text/javascript"></script>
        <script src="ymapsml_simpleobject.js" type="text/javascript"></script>
    	<style>
            html, body, #map {
                width: 100%; height: 100%; padding: 0; margin: 0;
            }
        </style>
    </head>
    <body>
    <div id="map"></div>
    </body>
    </html>


    ymaps.ready(function () {
        var myMap = new ymaps.Map('map', {
                center: [55.751574, 37.573856],
                zoom: 9
            }, {
                searchControlProvider: 'yandex#search'
            }),
            clusterer = new ymaps.Clusterer({
                // Зададим массив, описывающий иконки кластеров разного размера.
                clusterIcons: [
                    {
                        href: 'images/cat.png',
                        size: [40, 40],
                        offset: [-20, -20]
                    },
                    {
                        href: 'images/cat2.png',
                        size: [60, 60],
                        offset: [-30, -30]
                    }],
                // Эта опция отвечает за размеры кластеров.
                // В данном случае для кластеров, содержащих до 100 элементов,
                // будет показываться маленькая иконка. Для остальных - большая.
                clusterNumbers: [10],
                clusterIconContentLayout: null
            }),
            getPointData = function (index) {
                return {
                    balloonContentBody: 'балун <strong>метки ' + index + '</strong>',
                    clusterCaption: 'метка <strong>' + index + '</strong>'
                };
            },
            points = [
                [55.831903, 37.411961], [55.763338, 37.565466], [55.763338, 37.565466], [55.744522, 37.616378], [55.780898, 37.642889], [55.793559, 37.435983], [55.800584, 37.675638], [55.716733, 37.589988], [55.775724, 37.560840], [55.822144, 37.433781], [55.874170, 37.669838], [55.716770, 37.482338], [55.780850, 37.750210], [55.810906, 37.654142], [55.865386, 37.713329], [55.847121, 37.525797], [55.778655, 37.710743], [55.623415, 37.717934], [55.863193, 37.737000], [55.866770, 37.760113], [55.698261, 37.730838], [55.633800, 37.564769], [55.639996, 37.539400], [55.690230, 37.405853], [55.775970, 37.512900], [55.775777, 37.442180], [55.811814, 37.440448], [55.751841, 37.404853], [55.627303, 37.728976], [55.816515, 37.597163], [55.664352, 37.689397], [55.679195, 37.600961], [55.673873, 37.658425], [55.681006, 37.605126], [55.876327, 37.431744], [55.843363, 37.778445], [55.875445, 37.549348], [55.662903, 37.702087], [55.746099, 37.434113], [55.838660, 37.712326], [55.774838, 37.415725], [55.871539, 37.630223], [55.657037, 37.571271], [55.691046, 37.711026], [55.803972, 37.659610], [55.616448, 37.452759], [55.781329, 37.442781], [55.844708, 37.748870], [55.723123, 37.406067], [55.858585, 37.484980]
            ],
            geoObjects = [];
    
        for (var i = 0, len = points.length; i < len; i++) {
            geoObjects[i] = new ymaps.Placemark(points[i], getPointData(i));
        }
    
        clusterer.add(geoObjects);
        myMap.geoObjects.add(clusterer);
    
        myMap.setBounds(clusterer.getBounds(), {
            checkZoomRange: true
        });
    });
    Ответ написан
    Комментировать
  • Как поместить цикл постов конкретной категории в общем виде вывода всех постов на страницу Wordpress?

    @zordq Автор вопроса
    Был сделан вывод категорий в отдельные секции методом -
    <?php
    /* Template name: Результаты */
    /* Template part for displaying posts */
    ?>
    
    <?php
    
    $count_items = -1;
    
    if ($query->have_posts()) {
        ?>
    <section>
        <h2>Филлеры</h2>
        <?php $query = new WP_Query(array('post_type' => 'catalog', 'category_name' => 'fillers', 's' => $_GET['_sf_s'], 'posts_per_page' => 8)); while ($query->have_posts()) : $query->the_post(); ?>
        <a href="<?php the_permalink() ?>">
        <div class="offer__item">
            <img src="<?php the_field('image'); ?>" alt="">
            <span class="category__span">Категория товара</span>
            <span><?php the_title(); ?></span>
            <div>
                <button>Заказать</button>
                <button>Информация</button>
            </div>
        </div>
    </a>
        <?php endwhile; wp_reset_postdata(); ?>
    </section>
    
    <section>
        <h2>Биоревитализанты</h2>
        <?php $query2 = new WP_Query(array('post_type' => 'catalog', 'category_name' => 'biorevitalizanty', 's' => $_GET['_sf_s'], 'posts_per_page' => 8)); while ($query2->have_posts()) : $query2->the_post(); ?>
        <a href="<?php the_permalink() ?>">
        <div class="offer__item">
            <img src="<?php the_field('image'); ?>" alt="">
            <span class="category__span">Категория товара</span>
            <span><?php the_title(); ?></span>
            <div>
                <button>Заказать</button>
                <button>Информация</button>
            </div>
        </div>
    </a>
        <?php endwhile; wp_reset_postdata(); ?>
    </section>
    
    <?php
    } else {
            echo "</br> Результатов не найдено :(";
        }
    ?>


    Спасибо @Антон Куликов.
    Ответ написан
    Комментировать
  • Отправка данных из кастомной корзины в Telegram?

    @zordq Автор вопроса
    Было сделано интересное решение. Далее "Осторожно костыль!".

    function displayCart() {
        var cartArray = shoppingCart.listCart();
        var output = "" + "<div ><input class='input-send' name='phone' value='' placeholder='Номер телефона' requaired>" + "<input class='input-send' name='name' value='' placeholder='Ваша почта' requaired>"  + "<button class='sendspan' type='submit'>Отправить заказ</button></div>";
        for (var i in cartArray) {
            output += "<div class='form-group'>"
                + "<img src=" + cartArray[i].name + ">"
                + "<div class='input-group'><button class='minus-item input-group-addon' data-name=" + cartArray[i].name + ">-</button>"
                + "<input name='mutch' type='number' class='item-count form-control' data-name='" + cartArray[i].name + "' value='" + cartArray[i].count + "' requaired>"
                + "<button class='plus-item btn input-group-addon' data-name=" + cartArray[i].name + ">+</button></div>"
                + "<div name='price' requaired>" + cartArray[i].total + "</div>"
                + "<button class='delete-item btn btn-danger' data-name=" + cartArray[i].name + ">×</button>"
                + "<p class='form-message'></p>"
                + "<div id='message'></div>"
                + "</div>"
                + "<input class='offer' name='offer[]' value='Артикул: " + cartArray[i].name + " | Количество: " + cartArray[i].count + " | Сумма: " + cartArray[i].total + "' requaired>"
                + "</div>";
        }
    
        $('.show-cart').html(output);
        $('.total-cart').html(shoppingCart.totalCart());
        $('.total-count').html(shoppingCart.totalCount());
    }


    В данную строку передавались данные из дивов нужных нам переменных. Формировался один инпут, который счастливо улетал в телеграм.

    + "<input class='offer' name='offer[]' value='Артикул: " + cartArray[i].name + " | Количество: " + cartArray[i].count + " | Сумма: " + cartArray[i].total + "' requaired>"
    Ответ написан
    2 комментария
  • Не работает AJAX плагина "Search & Filter" в поиске для custom_post_types в Wordpress?

    @zordq Автор вопроса
    Я идиот, забыл про wp_head().

    Мой Вам совет, не забывайте про wp_head()!
    Ответ написан
    Комментировать
  • Не вызывается модальное окно?

    @zordq Автор вопроса
    РЕШЕНО, проблема была в подключении данной библиотеки.

    <script src="https://cdnjs.cloudflare.com/ajax/libs/tether/1.4.0/js/tether.min.js" integrity="sha384-DztdAPBWPRXSA/3eYEEUWrWCy7G5KFbe8fFjk5JAIxUYHKkDx6Qin1DkWx51bBrb" crossorigin="anonymous"></script>
    Ответ написан
    Комментировать
  • Страница для сбора данных с форм обратной связи?

    @zordq Автор вопроса
    Было решение не использовать CMS или фреймворки, поэтому для реализации требовались нестабильные и нестандартные механики. Переосмыслили. Была реализована возможность отправки в телеграм, что удобнее для клиента. Спасибо всем.
    Вот тут, описание.
    Ответ написан
    Комментировать
  • Уменьшение масштаба фона к центру?

    @zordq Автор вопроса
    background-size: auto 400px;

    Где 400px - та фиксированная высота, которая требуется.
    Ответ написан
    Комментировать
  • Как использовать несколько слайдеров Bootstrap в цикле Wordpress?

    @zordq Автор вопроса
    Благодаря Eugene Chefranov, найдено решение.

    Присваивая к id-слайдера id-поста через -

    post-<?php the_ID(); ?>
    Ответ написан
    Комментировать
  • Навигация на кастомной странице постов Wordpress?

    @zordq Автор вопроса
    Решение нашёл такое. Подкрепляю скриншотами.5cec3f1539daa762829356.png

    Его нужно убрать и решение тут, да это хук. Подробнее по ссылке.

    // Удалим слэш на конце, если нужно. Если слэш есть в структуре ЧПУ, то он будет добавляться и к постоянным страницам.
    add_filter( 'user_trailingslashit', 'no_page_slash', 70, 2 );
    function no_page_slash( $string, $type ){
       global $wp_rewrite;
    
    	if( 'page' === $type && $wp_rewrite->using_permalinks() && $wp_rewrite->use_trailing_slashes )
    		$string = untrailingslashit( $string );
    
       return $string;
    }


    Далее - помог еще один блог.

    Пример страницы с кастомными постами.
    <?php
    
      $current_page = $_GET['page']; // текущая страница
      $post_type = 'projects'; // имя custom post type
    
      // если GET параметр пустой, то принимаем, что текущая страница равна 1
      if ( empty($current_page) ) {
        $current_page = 1;
      }
    
      // аргументы, передаваемые в запрос
      $args = array(
        'post_type'      => $post_type, // custom post type
        'posts_per_page' => 10,         // количество постов на одной странице
        'paged'          =>  $current_page,      // задаем номер страницы, которую хотим отобразить
      );
    
      $projects = new WP_Query( $args ); // отправляем запрос
    
      if ( $projects->have_posts() ) :
    
        while ( $projects->have_posts() ) : $projects->the_post(); ?>
    
          // здесь HTML разметка поста
    
        <?php endwhile; 
    
        // если максимальное количество страниц больше 1, то выводим пагинацию
        if ( $projects->max_num_pages > 1 ) : 
    
          // если это не последняя страница и не первая, то выводим ссылки на следующую и предыдущую страницу
          if ( $projects->max_num_pages > $current_page && $current_page > 1 ) : ?> 
    
            <a href="<?php prevlink($current_page) ?>">Предыдущая страница</a>
            <a href="<?php nextlink($current_page) ?>">Следующая страница</a>
    
          // если текущая страница является первой страницей, выводим только ссылку на следующую страницу
          <?php elseif ( $current_page == 1 ) : ?> 
    
            <a href="<?php nextlink($current_page) ?>">Следующая страница</a>
    
          // если текущая страница - это последняя страница, выводим ссылку только на предыдущую страницу
          <?php elseif ( $current_page == $projects->max_num_pages ) : ?> 
    
            <a href="<?php prevlink($current_page) ?>">Предыдущая страница</a>
    
          <?php endif;
    
        endif;
    
      endif;
    ?>


    + добавляем функцию
    <?php
      // ссылка на следующую страницу
      function nextlink($current){
          echo '?page=' . ($current + 1);
      }
    
      // ссылка на предыдущую страницу
      function prevlink($current){
          echo '?page=' . ($current - 1);
      }
    ?>


    И всё, наша пагинация приобретает вид - sitename.ru/projects?page=2
    5cec41a87c583758949359.png
    Ответ написан
  • Как лучше набираться знаний?

    Никаких чужих макетов, никаких "смотри" видео. На личном опыте могу сказать, что 99.9% "блогеров" в направлении веб-разработки - это некомпетентные люди, которые берут либо западные форматы с их контентом и просто копируют видеоролики с не русского пространства нашего любимого ютуба, причем с ошибками. Есть хорошие ребята, но почти у всех смысл такой "хотите узнать больше, подписывайтесь на вебинар и бла-бла-бла".
    Если Вы планируете заниматься вёрсткой, то желательно понимать и основы работы с макетами, да и самые примитивные идеи дизайна Вам тоже пригодятся. Попробуйте освоить, допустим, Figma. Создайте свой собственный макет и реализуйте его в явь.

    Есть очень хорошие курсы, которые объединяют практику и теорию, причем они бесплатны.
    https://htmlacademy.ru/ например. Таких ресурсов очень много, заработать на знаниях - тренд в 2019.

    От себя могу добавить прекрасное приложение Sololearn, в котором есть вся базовая информация.

    Если брать во внимание фреймворки, то только официальная документация, плюсом будет, если она на английском, зачастую при переводе совершают ряд ошибок.

    По PHP могу посоветовать Котерова. Отличная книга, где всё понятно разъяснено, но зачем сразу с PHP? Начните с базы, благо она сейчас тоже постоянно расширяет свой диапазон.

    А самое главное - ничего не бывает сразу. Я тоже год назад верстая первую работу для галереи использовал таблицу, а до адаптивности мне было как до Лондона пешком от моего Красноярска. Удачи.
    Ответ написан
    Комментировать
  • Кастомный скелет поста Worpdress?

    @zordq Автор вопроса
    Добрый день, мною была решена поставленная задача. Благодаря azerphoenix и пробам, да ошибкам.

    Что было сделано, поэтапно.
    В functions.php Вашего проекта нужно зарегистрировать тип постов, который мы хотим использовать, поэтому пишем.

    add_action( 'init', 'register_post_types' );
    function register_post_types(){
    register_post_type('имя_вашего_типа_поста', array(
    'label' => null,
    'labels' => array(
    'name' => 'Проекты', // основное название для типа записи
    'singular_name' => 'Проект', // название для одной записи этого типа
    'add_new' => 'Добавить проект', // для добавления новой записи
    'add_new_item' => 'Добавление проекта', // заголовка у вновь создаваемой записи в админ-панели.
    'edit_item' => 'Редактирование проекта', // для редактирования типа записи
    'new_item' => 'Новый проект', // текст новой записи
    'view_item' => 'Смотреть проект', // для просмотра записи этого типа.
    'search_items' => 'Искать проект', // для поиска по этим типам записи
    'not_found' => 'Не найдено', // если в результате поиска ничего не было найдено
    'not_found_in_trash' => 'Не найдено в корзине', // если не было найдено в корзине
    'parent_item_colon' => '', // для родителей (у древовидных типов)
    'menu_name' => 'Проекты', // название меню
    ),
    'description' => '',
    'public' => true,
    'publicly_queryable' => null, // зависит от public
    'exclude_from_search' => null, // зависит от public
    'show_ui' => null, // зависит от public
    'show_in_menu' => null, // показывать ли в меню адмнки
    'show_in_admin_bar' => null, // по умолчанию значение show_in_menu
    'show_in_nav_menus' => null, // зависит от public
    'show_in_rest' => null, // добавить в REST API. C WP 4.7
    'rest_base' => null, // $post_type. C WP 4.7
    'menu_position' => null,
    'menu_icon' => null,
    //'capability_type' => 'post',
    //'capabilities' => 'post', // массив дополнительных прав для этого типа записи
    //'map_meta_cap' => null, // Ставим true чтобы включить дефолтный обработчик специальных прав
    'hierarchical' => false,
    'supports' => array('title','thumbnail'), // 'title','editor','author','thumbnail','excerpt','trackbacks','custom-fields','comments','revisions','page-attributes','post-formats'
    'taxonomies' => array(),
    'has_archive' => false,
    'rewrite' => true,
    'query_var' => true,
    ) );
    }


    Где add_action( 'init', 'register_post_types' ); действие инициализации функции регистрации типа поста, которая и приведена выше в коде.

    Далее ставим плагин для кастомных полей нашего поста.
    После чего в панеле управления CMS, появляется пункт с группой наших полей. Именуем группу, добавляем поля, у которых есть ярлык - имя самой строки \ поля, и имя - которое нужно для обращения к нашей верстке.

    В нашей верстке, где нужно то или иное значение или элемент из наших полей мы добавляем обращение через
    <?php the_field("имя_наших_полей") ?>.

    Создаем страницу с нашими постами, куда требуется вывод (каталог, например). В моем случае - это страница projects.php и в него пишем (далее идёт пример на основе моих данных, но интуитивно понятно):
    <?php
    /*
    * Template Name: Проекты
    */
    ?>
    
    <?php get_header(); ?>
    
    <?php
    
    /*
    * Получаем все посты
    * post_type - название нашего произвольного типа записей (идентификатор)
    * posts_per_page - количество получаемых записей
    * (в нашем случае стоит -1, это значит, что нужно получить все посты)
    */
    $projects = new WP_Query(array('post_type' => 'ваш_тип_постов', 'posts_per_page' => -1));
    
    ?>
    
    <div class="wrap">
    
    <!— Не забудьте в цикл добавить полученный объект постов $reviews —>
    <?php if ( $projects->have_posts() ) : while ( $projects->have_posts() ) : $projects->the_post(); ?>
    
    <h2><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></h2>
    <div class="review-excerpt"><?php the_excerpt(); ?></div>
    <span>Цена проекта: <?php the_field("цена_проекта") ?></span>
    <span>Кол-во спален: <?php the_field('количество_спален') ?></span>
    
    <?php endwhile; ?>
    <?php endif; ?>
    
    </div>
    
    <?php get_footer(); ?>


    После чего в админке создаем страницу с шаблоном, который создали выше. Публикуем и видим цикл наших постов, то есть все посты, которые мы "попросили" вывести на странице. Постарался обратить внимание на все детали. Буду рад вопросам и замечаниям, если кто столкнется с подобным.
    Ответ написан
    Комментировать
  • Как зарабатывать 1000$ на фрилансе верстальщику?

    А в чём прелесть фриланса? Найдите удалённую работу. Улучшите стек, например, взгляните в сторону Vue.js, где сейчас платят очень хорошо. Сам верстаю и стою на распутье бэка и фронта. Не могу уйти с основной работы, так как «фрилансом», действительно, заработать стабильно и хорошо - сложно, если почти невозможно (на вёрстке).
    Ответ написан
    1 комментарий
  • Swiper не работает в другом блоке?

    @zordq Автор вопроса
    Так как второй слайдер находился в модальном окне Bootstrap, то -

    // Swiper JS Внутри карточки магазига //
    	var myswiper2 = new Swiper('.swiper-container-item', {
    		slidesPerView: 1,
    		spaceBetween: 4,
    		slidesPerGroup: 1,
    		loop: true,
    		loopFillGroupWithBlank: true,
    		navigation: {
    			nextEl: '.swiper-button-next',
    			prevEl: '.swiper-button-prev',
    		},
    	});
    
    	// Swiper JS Modal //
    	$('#product_view').on('shown.bs.modal', function(e) {
    		myswiper2.update();
    	    //var $invoker = $(e.relatedTarget);
    		//swiper.slideTo($invoker.data('slider'));
    		//swiper.update();
    	});


    Была создана вторая переменная, закомментированый код не влияет на работу, то был указан в решении другого источника.
    Ответ написан
    1 комментарий
  • Не работают шрифты, где ошибаюсь (Sass, Gulp)?

    @zordq Автор вопроса
    @import "fonts.sass"
    @import "libs.sass"


    Именно в этих строках была ошибка, неправильный путь.
    Ответ написан
    Комментировать