Задать вопрос
  • Как вывести картинку в повторителе (ACF) на главной странице?

    wppanda5
    @wppanda5 Куратор тега WordPress
    WordPress Mедведь
    скорее всего это из за того что вы не указали контекст поста, для которого нужно получить данные повторителя

    <?php
    $page_id = get_option('page_on_front'); // или конкретный ID, например 123
    
    if( have_rows('main-categories', $page_id) ): ?>
    	<section class="main-categories">
    		<ul class="main-category-list">
    			<?php while( have_rows('main-categories', $page_id) ) : the_row(); ?>
    				<li class="main-category-item">
    					<a href="<?php the_sub_field('main-category-url'); ?>">
    						<img src="<?php the_sub_field('main-category-img'); ?>" alt="<?php the_sub_field('main-category-title'); ?>" />
    						<h3><?php the_sub_field('main-category-title'); ?></h3>
    					</a>
    				</li>
    			<?php endwhile; ?>
    		</ul>
    	</section>
    <?php endif; ?>
    Ответ написан
    4 комментария
  • WordPress как вывести фото до и после в записях?

    wppanda5
    @wppanda5 Куратор тега WordPress
    WordPress Mедведь
    из коробки последние версии
    официальный WPBakery Page Builder c Envato
    и из wp репы Twenty20 Image Before-After

    все работает 68c42a8398c9f577229215.png
    68c42aa3e50c4979772160.png
    Ответ написан
  • Оформление заказа на одной странице woocomerce?

    wppanda5
    @wppanda5 Куратор тега WooСommerce
    WordPress Mедведь
    C точки зрения юзабилити и конверсий идея отличная, применяется в куче магазинов.
    Но реализация в статье - весьма сомнительная, если говорить мягко.

    Лучше и правильно делать так.
    Страницу корзины отключить совсем.
    В чекауте есть предпросмотр заказа, он же объект корзины https://github.com/woocommerce/woocommerce/blob/50...

    вот его надо модифицировать, добавить инпут количества товаров, ссылку на удаление товаров, так же не плохо повесить туда ajax обновление и не забыть про триггер 'updated_checkout' для правильного пересчета налогов, доставок, скидок и прочей требухи

    погуглите туторов про это полно по идее
    Ответ написан
    2 комментария
  • Сильно ли влияет использование элементора на скорость загрузки сайта?

    wppanda5
    @wppanda5 Куратор тега WordPress
    WordPress Mедведь
    1) Самописный сайт — это очень размытое и зависит от навыка самописца, можно собрать лютого франкенштейна, который будет ползать и просить его убить, а можно ультра-мега шустрый сайт, буквально залетающий в клиент.

    2) Элементор — мусор, без дикого кэширования и кучи работ по оптимизации и микрооптимизации и грамотной
    настройки сервера более-менее серьезный сайт на нём не собрать. Все хвалёные билдеры — фигня, из них наиболее легкий — Бобер (Beaver Builder), но это не значит, что он хороший. Все они — куча инлайна и лютая вложенность, огромное, адски огромное количество подтягивающихся на фронт ресурсов, для даже вывода контента, в отличии от Гутенберга, требует от движка закатать рукава, обновления Элементора — это отдельная песня и боль, билдеры дырявые, как гей-парад.
    Они имеют право на жизнь для всяких там личных бложиков, ну или в качестве инструмента прототипирования.

    3) Гутенберг - ему не может не хватать возможностей, если не хватает каких-то готовых блоков, полно плагинов даже в офф репе WP, которые добавляют их практически не ограниченное количество, и ничего не мешает написать свои блоки, такие как надо. вот пример довольно толковой либы под него https://wordpress.org/plugins/kadence-blocks/
    Он во всём лучше сторонних билдеров.
    Ответ написан
    1 комментарий
  • Философия шаблонов woocomerce?

    wppanda5
    @wppanda5 Куратор тега WooСommerce
    WordPress Mедведь
    Refguser в принципе показал как экшенами и хуками пользоваться и это хороший подход.
    Для замороченной верстки можно пойти другим путем - переопределять сами шаблоны вывода https://developer.woocommerce.com/docs/theming/the... если на пальцах, то берете шаблон который вам надо изменить и закидываете свой в тему / дочернюю тему по адресу woocommerce, дальше структура как в папке templates https://github.com/woocommerce/woocommerce/tree/50...
    там можно переопределить все что угодно, но очень желательно сохранять все хуки.
    теоретически можно вообще собрать любой шаблон , например тут
    <?php
    	/**
    	 * Hook: woocommerce_before_single_product_summary.
    	 *
    	 * @hooked woocommerce_show_product_sale_flash - 10
    	 * @hooked woocommerce_show_product_images - 20
    	 */
    	do_action( 'woocommerce_before_single_product_summary' );
    	?>
    
    	<div class="summary entry-summary">
    		<?php
    		/**
    		 * Hook: woocommerce_single_product_summary.
    		 *
    		 * @hooked woocommerce_template_single_title - 5
    		 * @hooked woocommerce_template_single_rating - 10
    		 * @hooked woocommerce_template_single_price - 10
    		 * @hooked woocommerce_template_single_excerpt - 20
    		 * @hooked woocommerce_template_single_add_to_cart - 30
    		 * @hooked woocommerce_template_single_meta - 40
    		 * @hooked woocommerce_template_single_sharing - 50
    		 * @hooked WC_Structured_Data::generate_product_data() - 60
    		 */
    		do_action( 'woocommerce_single_product_summary' );
    		?>
    	</div>
    
    	<?php
    	/**
    	 * Hook: woocommerce_after_single_product_summary.
    	 *
    	 * @hooked woocommerce_output_product_data_tabs - 10
    	 * @hooked woocommerce_upsell_display - 15
    	 * @hooked woocommerce_output_related_products - 20
    	 */
    	do_action( 'woocommerce_after_single_product_summary' );
    	?>
    </div>

    можно убрать все do_action и запихать весь вывод в один файл, подход очень сомнительный, но встречается, индусы очень любят такое

    так же надо не забыть добавить в тему поддержку woocommerce https://developer.woocommerce.com/docs/theming/the... - это прямо важно

    на самом деле woo очень дружественно к разработчику и позволяет всякое достаточно не сложно
    Ответ написан
  • Как лучше перенести сайт с CMS - Joomla! 3.10.12 на WordPress?

    wppanda5
    @wppanda5 Куратор тега WordPress
    WordPress Mедведь
    Подобрать / написать тему подходящую.
    установить woo и прочее что надо

    переносить контент руками - тупо
    1) у вас есть доступ к выгрузкам
    2) у вас есть доступ к базе
    мигрировать даже стандартными инструментами дело не сложное

    Элементор и прочие билдеры - мусор, хотя изначально так может не казаться.
    1) Есть иерархия шаблонов + custom_fields + template_redirect // классика
    2) Есть Гуттенберг // он крутой, но повозиться придется с написанием нужных модулей
    Ответ написан
    3 комментария
  • Как сделать не стандартный каталог woocomerce?

    wppanda5
    @wppanda5 Куратор тега WooСommerce
    WordPress Mедведь
    Ну если вы остановились на Filter Everything Pro то ищите в нем место где формируется поисковый запрос, там на 99,99(99) % есть некий хук, на который вы можете повеситься и сделать что то типа такого

    if (isset($query_args['tax_query'])) {
            foreach ($query_args['tax_query'] as $key => $tax) {
                if ( $tax['taxonomy'] === 'product_visibility') {
                    unset($query_args['tax_query'][$key]);
                }
            }
            $query_args['tax_query'] = array_values($query_args['tax_query']);
        }
    Ответ написан
  • Как сделать сниппет с отзывами?

    wppanda5
    @wppanda5 Куратор тега WordPress
    WordPress Mедведь
    Ответ написан
    Комментировать
  • Как добавить дполнительные поля в структурированные данные товара (Schema) в WooCommerce?

    wppanda5
    @wppanda5 Куратор тега WooСommerce
    WordPress Mедведь
    add_filter('woocommerce_structured_data_product', 'add_missing_structured_data_fields', 10, 2);
    
    function add_missing_structured_data_fields($markup, $product) {
        
        $reviews = get_comments(array(
            'post_id' => $product->get_id(),
            'status' => 'approve',
            'type' => 'review'
        ));
        
        if ($reviews) {
            $markup['review'] = array();
            
            foreach ($reviews as $review) {
                $rating = get_comment_meta($review->comment_ID, 'rating', true);
                
                $markup['review'][] = array(
                    '@type' => 'Review',
                    'author' => array(
                        '@type' => 'Person',
                        'name' => get_comment_author($review->comment_ID)
                    ),
                    'datePublished' => get_comment_date('c', $review->comment_ID),
                    'description' => get_comment_text($review->comment_ID),
                    'reviewRating' => array(
                        '@type' => 'Rating',
                        'ratingValue' => $rating ? $rating : 5,
                        'bestRating' => 5,
                        'worstRating' => 1
                    )
                );
            }
        }
        
        if ($product->get_rating_count() > 0) {
            $markup['aggregateRating'] = array(
                '@type' => 'AggregateRating',
                'ratingValue' => $product->get_average_rating(),
                'reviewCount' => $product->get_review_count(),
                'bestRating' => '5',
                'worstRating' => '1'
            );
        }
        
        $markup['shippingDetails'] = array(
            '@type' => 'OfferShippingDetails',
            'shippingRate' => array(
                '@type' => 'MonetaryAmount',
                'value' => '0',
                'currency' => get_woocommerce_currency()
            ),
            'shippingDestination' => array(
                '@type' => 'DefinedRegion',
                'addressCountry' => 'RU'
            )
        );
        
        $markup['hasMerchantReturnPolicy'] = array(
            '@type' => 'MerchantReturnPolicy',
            'applicableCountry' => 'RU',
            'returnPolicyCategory' => 'https://schema.org/MerchantReturnFiniteReturnWindow',
            'merchantReturnDays' => 14,
            'returnMethod' => 'https://schema.org/ReturnByMail',
            'returnFees' => 'https://schema.org/FreeReturn'
        );
        
        return $markup;
    }
    Ответ написан
  • Как сделать автоматическое изменение статуса заказа "Выполнено" для скачиваемого бесплатного товара в Woocommerce?

    wppanda5
    @wppanda5 Куратор тега WooСommerce
    WordPress Mедведь
    add_action('woocommerce_thankyou', 'wpp_auto_complete_free_fully_downloadable_orders');
    
    function wpp_auto_complete_free_fully_downloadable_orders($order_id) {
        $order = wc_get_order($order_id);
    
        if (!$order || !in_array($order->get_status(), ['pending', 'on-hold', 'processing'])) {
            return;
        }
    
        if ($order->get_total() != 0) {
            return;
        }
    
        $all_downloadable = true;
    
        foreach ($order->get_items() as $item) {
            $product = $item->get_product();
            if (!$product || !$product->is_downloadable()) {
                $all_downloadable = false;
                break;
            }
        }
    
        if ($all_downloadable) {
            $order->update_status(
                'completed',
                'All items are free and downloadable. Order completed automatically.'
            );
        }
    }
    Ответ написан
    1 комментарий
  • Как изменить страницу входа wordpress?

    wppanda5
    @wppanda5 Куратор тега WordPress
    WordPress Mедведь
    <?php
    /**
     * Plugin Name: Habr Q&A Custom Login Page
     * Description: Кастомизация страницы входа WordPress - заменяет логотип на название и описание сайта, скрывает ссылку на главную
     * Version: 1.0.0
     * Author: WP_Panda
     * Author URI: https://wp-panda.pro
     * Email: panda@wp-panda.pro
     * License: GPL-2.0+
     * License URI: http://www.gnu.org/licenses/gpl-2.0.txt
     */
    
    if (!defined('ABSPATH')) {
    	exit; // Запрет прямого доступа
    }
    
    function wpp_habr_custom_login_styles() {
    	// Убираем стандартный логотип WordPress
    	add_filter('login_headerurl', function() { return home_url(); });
    	add_filter('login_headertext', function() { return get_bloginfo('name'); });
    
    	// Добавляем свои стили
    	echo '<style>
            #login h1 a {
                display: none !important;
            }
            .login #backtoblog {
                display: none !important;
            }
        </style>';
    }
    add_action('login_head', 'wpp_habr_custom_login_styles');
    
    function wpp_habr_custom_login_header() {
    	echo '<div id="login">
            <h1>'.esc_html(get_bloginfo('name')).'</h1>
            <p style="text-align:center">'.esc_html(get_bloginfo('description')).'</p>';
    }
    add_action('login_header', 'wpp_habr_custom_login_header');
    Ответ написан
    1 комментарий
  • Проблема с плагином Wordpress?

    wppanda5
    @wppanda5 Куратор тега WordPress
    WordPress Mедведь
    да проблема в плагине они используют не существующую функцию wp_json_sanitize возможно она была в старых версиях движка, не уверен в этом, но сейчас такой нет совершенно точно
    689273d4be8f4356768245.png

    Рекомендую использовать другой плагин или сделать/ заказать свое решение под задачу, посмотрел интереса ради код этого плагина, это творение Аi - весьма кривое
    Ответ написан
    7 комментариев
  • Как перетащить отзывы с другого сайта на сайт на WP?

    wppanda5
    @wppanda5 Куратор тега WordPress
    WordPress Mедведь
    У Авито нет публичного API для отзывов
    Что за сторонний сайт агрегатор хз, но скорее всего тоже, они это не любят

    Соответственно писать парсер или попробовать настроить плагины типа Content Egg или WP Scraper, но с ними не факт что выйдет
    Ответ написан
    Комментировать
  • Acf pro github уже нету?

    wppanda5
    @wppanda5 Куратор тега WordPress
    WordPress Mедведь
    Вот его однояйцевый близнец Secure Custom Fields
    Ответ написан
    Комментировать
  • Как удалить данные о работе imagify?

    wppanda5
    @wppanda5 Куратор тега WordPress
    WordPress Mедведь
    Удалить плагин, затем выполнить
    DELETE FROM wp_postmeta WHERE meta_key LIKE 'imagify_%';
    DELETE FROM wp_options WHERE option_name LIKE 'imagify_%';


    эти черти не чистят свои опции при удалении плагина
    Ответ написан
    2 комментария
  • Как реализовать вывод и управление списком в Wordpress?

    wppanda5
    @wppanda5 Куратор тега WordPress
    WordPress Mедведь
    не надо городить велосипед
    создаете в базе таблицу, дальше работаете

    в админке через wp_list_table в гугле полно туторов как его пользовать

    на морде простой wpdb get_results
    Ответ написан
    7 комментариев
  • Купил тему the7 для wordpress на themeforest, но не дают активировать из-за санкций?

    wppanda5
    @wppanda5 Куратор тега WordPress
    WordPress Mедведь
    тема будет работать и без лицензии обновлять только руками качая дистрибутивы
    Ответ написан
    2 комментария
  • Как настроить ограничение по количеству отправки с Contact Form 7 для одного пользователя?

    wppanda5
    @wppanda5 Куратор тега WordPress
    WordPress Mедведь
    как то так
    со сменой браузера или IP отправит еще раз конечно, но рядовой юзер теоретически отправить не сможет, для большего контроля можно добавить fingerprint
    ну и опцию можно одну , и по ней искать, но направление вам дал, дальше уже доработаете
    // Хуки для Contact Form 7
    add_action('wpcf7_before_send_mail', 'wpp_limit_cf7_submissions');
    add_filter('wpcf7_display_message', 'wpp_block_cf7_form_display', 10, 2);
    
    function wpp_limit_cf7_submissions($contact_form) {
    	$form_id = $contact_form->id();
    	$user_ip = $_SERVER['REMOTE_ADDR'];
    	$user_agent = $_SERVER['HTTP_USER_AGENT'];
    
    	// Создаем уникальный ключ для пользователя
    	$user_key = md5($user_ip . $user_agent);
    	$option_key = 'cf7_submission_' . $form_id . '_' . $user_key;
    
    	// Проверяем, отправлял ли пользователь форму за последние 24 часа
    	$last_submission = get_option($option_key);
    	$current_time = time();
    
    	if ($last_submission && ($current_time - $last_submission) < 86400) { // 24 часа
    		// Блокируем отправку
    		$submission = WPCF7_Submission::get_instance();
    		if ($submission) {
    			$submission->add_status('aborted', 'Вы уже отправляли заявку. Пожалуйста, подождите 24 часа.');
    		}
    		return false;
    	}
    
    	// Записываем время отправки
    	update_option($option_key, $current_time, false);
    	return $contact_form;
    }
    
    function wpp_block_cf7_form_display($message, $status) {
    	if ($status === 'aborted') {
    		return 'Вы уже отправляли заявку. Пожалуйста, подождите 24 часа перед повторной отправкой.';
    	}
    	return $message;
    }
    Ответ написан
    5 комментариев
  • Существует ли скрипт поддерживающий несколько уровней тегов?

    wppanda5
    @wppanda5 Куратор тега WordPress
    WordPress Mедведь
    Тэги не иерархическая таксономия
    Хочется иерархических тэгов, заведите отдельную кастюмную таксономию, над стандартными лучше не измываться, это может обернуться непонятным.

    но если очень хочется то кто запретит, вот это сделает теги иерархическими

    function wpp_make_tags_hierarchical() {
    
    	$tag_args = get_taxonomy('post_tag');
    	$tag_args->hierarchical = true;
    	$tag_args->rewrite['hierarchical'] = true;
    }
    add_action('init', 'wpp_make_tags_hierarchical', 999);
    Ответ написан
    2 комментария
  • Как создать плиточное меню WP с различным кеглем, по мере варьирования числа постов в категориях?

    wppanda5
    @wppanda5 Куратор тега WordPress
    WordPress Mедведь
    как ни будь так

    $categories = get_categories(array(
            'orderby' => 'count',
            'order' => 'DESC',
            'hide_empty' => true
        ));
    
            $counts = wp_list_pluck($categories, 'count');
            $max_count = max($counts);
            $min_count = min($counts);
            $count_range = ($max_count - $min_count) ? ($max_count - $min_count) : 1;


    дальше проходите категории циклом


    $normalized = ($category->count - $min_count) / $count_range;
        
                $font_size = 14 + round($normalized * 10, 2);


    ну а дальше стилизуете как надо
    Ответ написан
    Комментировать