Ответы пользователя по тегу WordPress
  • Как через шорткод вывести wp_nav_menu внутри HTML структуры?

    SeaInside
    @SeaInside
    15 лет пилю все эти штуки
    wp_nav_menu(['echo' => false]), м? :)
    Оно по умолчанию его выводит, а не возвращает, вот и выводится сначала меню, потом всё остальное.
    Ответ написан
    Комментировать
  • Как правильно делать правки или допиливать кусок сайта, если уже разместил на WP?

    SeaInside
    @SeaInside
    15 лет пилю все эти штуки
    Изначально в сборке этот кейс предусмотреть. Не так уж и много - пути компиляции в WP версии заменить.
    Нет так уж сложно :)
    Ответ написан
    Комментировать
  • Как сделать такое на ACF?

    SeaInside
    @SeaInside
    15 лет пилю все эти штуки
    Делать обычный textfield и в комментариях к нему написать "Для выделения жёлтым цветом используйте тег span".
    Не стоит рассчитывать, что всегда можно сделать интерфейс совсем для детей, какие-то знания при наполнении всё равно понадобятся.
    Если таких сносок становится много и они повторяются, есть смысл собрать их вместе и вынести отдельно. Под это дело хорошо подходят WP Notices, при небольшой доработке, чтобы можно было свернуть/развернуть.

    5f428c37a371a346112115.jpeg

    Можно вставить редактор WP (TinyMCE который), кастрировать его на дополнительные табы (оставив только базовое форматирование) и поставив ограничение на высоту (ибо штатный растягивается слишком сильно).
    Можно свою кнопку добавить, но мне обычно лень, если и без этого можно обойтись. :)

    5f428b190ba60378326573.jpeg

    Только не спрашивайте меня "а как это всё сделать" - всё есть в гугле. Про второй ваш способ просто забудьте.
    Ответ написан
    1 комментарий
  • Где можно увидеть пример магазина на WooCommerce?

    SeaInside
    @SeaInside
    15 лет пилю все эти штуки
    "WooCommerce" и "best practice" в одном предложении - это оксюморон, потому что лучшие практики в среде WordPress разработчиков и в остальном мире очень далеки друг от друга.

    Хотите лучших практик с точки зрения разработки по-человечески - WP можно, но зачем? WooCommerce там окажется погребён под таким слоем своих абстракций, что... В общем, зачем.
    Вряд ли на такое где-то в опенсорсе можно посмотреть.

    Хотите best practice с точки зрения разработчиков WP и WC - ну, купите премиум-тему с заявленной поддержкой WC, они и сами там в установщике предлагают. Но помните, что это "тупое говно тупого говна" (с).
    А вообще "правильный" - это решающий свою задачу.
    Ответ написан
    3 комментария
  • Как пересылать сообщения с формы Elementor pro в whatsapp или телеграм?

    SeaInside
    @SeaInside
    15 лет пилю все эти штуки
    Можно.
    Заказывайте разработку фрилансерам, или попробуйте это, я погуглил за вас.
    Ответ написан
  • Есть ли проблемы при использовании конструктора страниц на Wordpress?

    SeaInside
    @SeaInside
    15 лет пилю все эти штуки
    Надо понимать, что чем больше свистелок напихано в конструктор, тем страшнее код и тем медленнее всё работает.
    Плохо с точки зрения СЕО, ещё хуже по быстродействию. Впрочем, наговнокодить и без конструкторов можно.

    Зашёл тут на сайт Элементора... Ну нормальная такая вложенность. У нас всё хорошо работает.
    Мне смотреть на это прямо физически больно.
    5edfabe5696f4566168930.png

    Грузится всё это добро на средних телефонах 15 секунд. Да норм, чё. Это гугл ещё "среднее устройство" взял посовременнее с внедрением Web Vitals.
    5edfac3f457bc462289433.png

    Есть своя ниша для таких вещей, где-то на уровне Тильды. Лендос для ларька потестировать нишу - вполне себе.
    Ответ написан
    2 комментария
  • Как уменьшить влияние кода на скорость загрузки сайта?

    SeaInside
    @SeaInside
    15 лет пилю все эти штуки
    Только отложив загрузку API Яндекс карт и инициализацию до того момента, когда они реально понадобится.
    Вешаете обсервер, как докрутили до блока с картой - загружаем скрипт карт самостоятельно (document.createElement('script') и бла-бла) и вызываем инициализацию.
    Если карта прямо на первом экране находится - ничего не сделать, очень жаль.
    Ответ написан
    Комментировать
  • Почему это говнокод?

    SeaInside
    @SeaInside
    15 лет пилю все эти штуки
    if(is_singular( 'portfolio' ) ) {
    Это так называемый WordPress codestyle (расставление скобок и пробелов) - забудьте как страшный сон, фу.
    А если уж и следуете - то следуйте везде, а у вас тут так, тут иначе.

    <?
    Нельзя короткую открывающую конструкцию использовать, пишите полностью.
    Исключение - <?= - я бы даже рекомендовал использовать такую запись, если кроме вывода действительно ничего не надо.

    Код вперемешку с разметкой - это очень плохо и сложно для восприятия. WordPress, к сожалению, не предлагает никаких штатных опций этого избежать, им то ли кажется, что это норма, то ли объём кодовой базы такой, что переписать нормально возможности нет. Сами себе придумайте вариант разделения от простого выноса логики в функции (например, в последнем блоке кода выдумайте какую-нибудь функцию getPostTags и ей получайте разметку) до шаблонизаторов.

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

    В логику вникать лень. Сами посмотрите ещё раз и оцените, есть ли там повторяющиеся куски кода, можно ли сделать эффективнее...

    Как можно заметить, большая часть косяков относится к визуальному форматированию - и это логично, ибо код мы гораздо чаще читаем, чем пишем, и надо сделать этот процесс удобным.
    Приведите форматирование к единому виду - и нормально будет.
    Говно, не говно - у меня вот крайне редко возникает мысль "вау, великолепный код!".
    Если код можно без проблем прочесть и понять чего автор хотел - он нормальный, и это окей.
    Ответ написан
    Комментировать
  • Как удалить "Отрывок" в Wordpress?

    SeaInside
    @SeaInside
    15 лет пилю все эти штуки
    Здравствуйте.
    За длину отрывка отвечает фильтр 'excerpt_length' - вы его верно сбросили.
    За окончание отрывка отвечает другой фильтр - 'excerpt_more'.

    Таким образом, ваша проблема решается так:
    add_filter('excerpt_more', '__return_false');

    А лучше всего, если отрывок в конкретном месте вам не нужен - просто уберите его оттуда без фильтров.
    Год спустя понадобится вывести отрывок в другом месте - и будете удивляться и долго вспоминать, почему вызов the_excerpt() есть, а отрывок не выводится. Или хотя бы фильтр вешать не глобально, а проверяя перед навешиванием, чтобы он применялся только в нужном вам случае.
    Ответ написан
    Комментировать
  • Система комментирования для WordPress?

    SeaInside
    @SeaInside
    15 лет пилю все эти штуки
    Если не нужен социальный логин - возьмите штатную систему WP и докрутите AJAX-комментарии.
    Если нужен социальный логин - у вас варианта два: wpDisquz и AnyComment.
    wpDisquz недавно ковырял, и проблем у него ровно две:
    1. отвратительное качество вёрстки и большая сложность (невозможность) что-то в нём кардинально изменить. То есть если он визуально нравится "как есть" (там есть несколько вариантов "тем") - можно брать.
    2. ужасный перфоманс (впрочем, лишних пару секунд при загрузке важно далеко не всем)

    AnyComment выглядит как более по уму сделанное решение, но чего-то мне в нём не хватило в сравнении с wpDisquz, поэтому близко не смотрел.

    Если нет нужды хранить комментарии у себя - посмотрите Disquz, он бесплатный до 50к запросов в сутки, если память меня не подводит, и интегрируется предельно легко.
    Ответ написан
  • Что не так с шоткодом?

    SeaInside
    @SeaInside
    15 лет пилю все эти штуки
    Привет.
    Нужно сделать так:
    add_shortcode('fbbuttons', 'show_fbbuttons'); // shotcode: [fbbuttons]
    function show_fbbuttons() {
      ob_start();
      require_once(TEMPLATEPATH . '/block-fbbuttons.php');
      $fbbuttons = ob_get_clean();
    
      return $fbbuttons;
    }


    Вероятнее всего, будет работать нормально, даже если не включать буферизацию, то есть:
    add_shortcode('fbbuttons', 'show_fbbuttons'); // shotcode: [fbbuttons]
    function show_fbbuttons(){
      require_once(TEMPLATEPATH . '/block-fbbuttons.php');
    
      return '';
    }

    Но так делать не принято, шорткод должен возвращать значение, а не выводить.

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

    SeaInside
    @SeaInside
    15 лет пилю все эти штуки
    Нужно убедиться, что в на странице вызываются функции "wp_head" (в теге head, header.php) и "wp_footer" (перед закрывающим тегом body, footer.php). Функции wp_enqueue_* завязаны на эти две функции.
    Если функции есть, но ничего не выводится - копайте в сторону того, что их перехватывает и не отдаёт на вывод (add_filter('wp_head')).
    Ответ написан
    Комментировать
  • Как получить шаблон и записать его в переменную wordpress?

    SeaInside
    @SeaInside
    15 лет пилю все эти штуки
    Потому что get_template_part == include, она подключает, а не возвращает файл.

    function get_article() {
      ob_start();
      get_template_part('components/article-block');  
      $block = ob_get_contents();
      ob_end_clean();
      
      die(json_encode([
        'block' => $block,
      ]));
    }
    Ответ написан
    2 комментария
  • Как получить сестринские элементы меню на странице для сайдбара wordpress?

    SeaInside
    @SeaInside
    15 лет пилю все эти штуки
    Встроенных инструментов для этого нет.
    Либо писать свой Walker (сложный путь), либо на JS отследить активный пункт и соседним установить нужный класс (куда проще).
    Ответ написан
  • Как в wordpress вывести категорию в определенный блок?

    SeaInside
    @SeaInside
    15 лет пилю все эти штуки
    Класс PostService, который у вас получает посты - это нечто не относящееся к WordPress, что-то самопальное.
    Найдите, где этот класс объявляется - и там в методе getPostsForTag уже можно смотреть, что сломалось.
    Ответ написан
    5 комментариев
  • Почему шаблон, подключенный через get_template_part не имеет доступа к родительским переменным?

    SeaInside
    @SeaInside
    15 лет пилю все эти штуки
    Работают require и include следующим образом: просто вставляют содержимое файла из переданного пути в то место, где его вызвали. Таким образом, подключаемый файл получает контекст файла, который его вставил. Это просто перенос кода из одного места в другое.

    Когда вы вызываете функцию - создаётся новый контекст, в котором нет явного доступа к родительскому контексту (области видимости).
    $testVar = 123;
    function testFunc() {
      var_dump($testVar); // будет undefined
    }
    testFunc();


    Можно получить доступ к конкретным вещам из глобального контекста с помощью global [...vars]
    $testVar = 123;
    $anotherVar = 123;
    function testFunc() {
      global $testVar;
      var_dump($testVar); // будет 123
      var_dump($anotherVar); // будет undefined
    }
    testFunc();


    А теперь посмотрим на код функции load_template.
    Видите что-то знакомое, похожее на предыдущий пример?

    То есть, простой ответ на вопрос: потому что вы вызываете require в контексте файла, в котором объявлены переменные, а get_template_part вызывает require в контексте, где доступа к этим переменным нет.
    Ответ написан
  • Advanced Custom Fields. Какое значение выбрать для post_object?

    SeaInside
    @SeaInside
    15 лет пилю все эти штуки
    Задача решается как-то странно - тут вообще ACF ни к чему.
    У вас есть кастомный тип постов (watch-page), создайте и привяжите к нему кастомную таксономию (например watch-page__tax), создайте нужные категории.
    Если всё сделано верно, то в админ-панели при создании поста справа можно будет указать нужную категорию (или несколько).

    Ну а дальше
    $query = new WP_Query([
    	'post_type' => 'watch-page',
    	'tax_query' => [
    		[
    			'taxonomy' => 'watch-page__tax',
    			'field'    => 'name',
    			'terms'    => 'Название категории'
    		]
    	]
    ]);
    Ответ написан
    Комментировать
  • Как добавить meta description использя Advanced Custom Fields?

    SeaInside
    @SeaInside
    15 лет пилю все эти штуки
    Здравствуйте! А в чём проблема-то?
    Вы можете совершенно спокойно ровно этот же код использовать в header.php (ну или где там у вас лежит meta description).

    // предположим, header.php
    // какое-то содержание
    // ...
    <?php 
    $acfFields = get_fields();
    $metaDescriptionValue = $acfFields['about'] ? $acfFields['about'] : 'Meta Description по умолчанию';
    ?>
    <meta name="description" content="<?= $metaDescriptionValue; ?>">
    // ...
    // остальное содержание


    get_field и get_fields замечательно работают даже вне loop.
    Ответ написан
    Комментировать