Задать вопрос
  • WP + qTranslate + qTranslate ACF + ACF — как получить число из метаполя в wp_query?

    wppanda5
    @wppanda5 Куратор тега WordPress
    WordPress Mедведь
    Как это можно обойти, подсунув уже обработанные qTranslate данные?

    Никак qTranslate работает уже с полученными из базы данными
    https://github.com/qTranslate-Team/qtranslate-x/bl...

    А когда ему самому надо что то в базе он именно LIKE и пользует
    Ответ написан
    Комментировать
  • Как в корзине задать для определенной категории товаров в инпуте шаг в 50 единиц, а также присвоить цену за эти 50 ед. чтобы был правильный расчет?

    wppanda5
    @wppanda5 Куратор тега WooСommerce
    WordPress Mедведь
    Тестовый сайт woocommerce я только что грохнул, и проверить не могу.

    Но судя по этому.
    https://docs.woocommerce.com/wc-apidocs/source-fun...
    и этому
    https://github.com/woocommerce/woocommerce/blob/ma...

    Делать надо так:

    add_filter( 'woocommerce_quantity_input_args', 'wpp_woocommerce_step_quantity_input', 10, 2 );
    
    function wpp_woocommerce_step_quantity_input( $args, $product ) {
           // ТУТ можете слазить в $product и сделать проверку на доп условие
           // которое допишите к if ( is_cart( ) && допусловие  )
    	if ( is_cart( ) ) {
                      $args['min_value']  = 50;
    	          $args['step']            = 50; 
            }
    	return $args;
    }
    Ответ написан
    Комментировать
  • Почему polylang не переключает язык?

    wppanda5
    @wppanda5 Куратор тега WordPress
    WordPress Mедведь
    У вас одна и та же проблема, при использовании qtranslate-X и при использовании polylang, если хорошенько подумать, не приходит в голову, что они тут ни причем?
    А проблема в теме или других плагинах?

    Простой пример аналогичной ситуации
    Недавно добавляю на сайт ssl
    1. Выпускаю сертификат, настраиваю nginx, меняю ссылки в базе, рестартую nginx.
    САЙТ ПАДАЕТ
    2. Запускаю nginx -t, все ОK, смотрю конфиги, все нормально, все как всегда, рестартую nginx.
    САЙТ ЛЕЖИТ
    3. Много матерюсь, сношу настройки для ssl, рестартую nginx.
    САЙТ РАБОТАЕТ
    4. Много и громко матерюсь, пишу настройки с нуля, рестартую nginx.
    САЙТ ЛЕЖИТ
    5. Смеюсь, трясу бубном, лезу в гуглл, нихрена не понимаю. Решаю залезть в тему, в теме нахожу
    add_action( 'template_redirect', 'redirect_from_https_to_http', 1 );
    function redirect_from_https_to_http() {
        if ( is_ssl() && ! is_admin() ) {
    
            if ( 0 === strpos( $_SERVER['REQUEST_URI'], 'http' ) ) {
                wp_redirect( preg_replace( '|^https://|', 'http://', $_SERVER['REQUEST_URI'] ), 301 );
            } else {
                wp_redirect( 'http://' . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'], 301 );
            }
            die();
    
        }
    }

    6.Занавес
    Ответ написан
    2 комментария
  • Какой хук отвечает за отправку отзыва woocommerce?

    wppanda5
    @wppanda5 Куратор тега WordPress
    WordPress Mедведь
    такой же как и в WordPress
    WooCommerce отзывы это тривиальные комментарии.

    Соответственно
    При добавлении коммента
    add_action('wp_insert_comment', 'wpp_comment_inserted', 99, 2);
    
    function wpp_comment_inserted($comment_id, $comment_object) {
        //$comment_object - объект комментария, 
        //получаете пост на который он оставлен
        // и если это продукт отправляете письмо
    }


    При одобрении коммента
    add_action('transition_comment_status', 'wpp_comment_approve', 10, 3);
    
    function wpp_comment_approve($new_status, $old_status, $comment_object) {
        if( $old_status !== $new_status && $new_status === 'approved' ) {
            //$comment_object - объект комментария,
           //получаете пост на который он оставлен
           // и если это продукт отправляете письмо
        }
    }
    Ответ написан
    Комментировать
  • Почему перезагружается страница при отправке аякс-формы в popup?

    wppanda5
    @wppanda5 Куратор тега WordPress
    WordPress Mедведь
    submit,button - не важно, preventDefault решает
    перезагрузки не увидел, однако Ajax у вас сделан через зад79e68b832a.jpg так делать не надо
    Ответ написан
    1 комментарий
  • Есть ли готовое решение (плагин, сервис) Склада для WooCommerce?

    wppanda5
    @wppanda5 Куратор тега WordPress
    WordPress Mедведь
    Плагин есть memark.ru/product/integratsiya-mojsklad-i-woocommerce

    Сейчас практически для любой CRM есть плагин для WooCommerce
    Ответ написан
  • Какой хук для WordPress можно использовать, для поиска и замены на всём сайте?

    wppanda5
    @wppanda5 Куратор тега WordPress
    WordPress Mедведь
    function wpp_buffer_content($buffer) {
            // переменная $buffer содержит все содержимое страницы и его можно менять
            // например 
           //$buffer = str_replace( 'Витя', 'Alien', $buffer );
            return $buffer;
        }
    
        function wpp_buffer_start() {
            ob_start( 'wpp_buffer_content' );
        }
    
        function wpp_buffer_stop() {
            ob_end_flush();
        }
    
        add_action( 'wp_head', 'wpp_buffer_start' );
        add_action( 'wp_footer', 'wpp_buffer_stop' );
    Ответ написан
    1 комментарий
  • Как вывести в превью поста количество изображений прикрепленные к посту?

    wppanda5
    @wppanda5 Куратор тега WordPress
    WordPress Mедведь
    Вариантов много, например так
    $attach = get_children(array('post_parent'=>$post->ID));
    $attach_count = count($attach);
    Ответ написан
    8 комментариев
  • Как лучше организовать импорт вариативного товара в WooCommerce?

    wppanda5
    @wppanda5 Куратор тега WordPress
    WordPress Mедведь
    Я в подобной ситуации сделал так
    f2dc93a888.jpg
    Механизм импорта соответственно писал сам
    Ответ написан
    Комментировать
  • Как организовать фильтр по городам в меню Wordpress?

    wppanda5
    @wppanda5 Куратор тега WordPress
    WordPress Mедведь
    Когда то писал для таких целей простенький плагин который добавляет геолокацию на сайт, говорят, говорят, что до сих пор работает, он вам поможет.
    Ответ написан
    7 комментариев
  • Как в корзине woocommerce можно вывести текст после цены товаров определённой категории не затрагивая итоговую цену?

    wppanda5
    @wppanda5 Куратор тега WordPress
    WordPress Mедведь
    Не знаю, как вы храните единицы измерения, поэтому предположу, что в мета поле _product_units, тогда делаем так.
    function wpp_add_units_after_price_in_cart( $price, $cart_item, $cart_item_key ) {
            
            // если единицы измерения хранятся не в в мета поле _product_units, тут получаем их
             //   из места их хранения по своему
            $units = get_post_meta( $cart_item['product_id'], '_product_units', true );
            
            if ( ! empty( $units ) ) {
                $price .=  ' ' . $units ;
            }
            return $price;
        }
        add_filter( 'woocommerce_cart_item_price', 'wpp_add_units_after_price_in_cart', 10, 3 );
    Ответ написан
    1 комментарий
  • Как вывести изображения категорий товаров?

    wppanda5
    @wppanda5
    WordPress Mедведь
    В отдельный файл сложите поправленный класс
    if ( !class_exists( 'WPP_WC_Product_Cat_List_Walker_With_Thumb' ) ) :
            class WPP_WC_Product_Cat_List_Walker_With_Thumb extends Walker {
    
                public $tree_type = 'product_cat';
    
                public $db_fields = array(
                    'parent' => 'parent',
                    'id'     => 'term_id',
                    'slug'   => 'slug',
                );
    
                public function start_lvl(&$output, $depth = 0, $args = array()) {
                    if ( 'list' != $args[ 'style' ] )
                        return;
                    $indent = str_repeat( "\t", $depth );
                    $output .= "$indent<ul class='children'>\n";
                }
    
                public function end_lvl(&$output, $depth = 0, $args = array()) {
                    if ( 'list' != $args[ 'style' ] )
                        return;
                    $indent = str_repeat( "\t", $depth );
                    $output .= "$indent</ul>\n";
                }
    
                public function start_el(&$output, $cat, $depth = 0, $args = array(), $current_object_id = 0) {
                    $output .= '<li class="cat-item cat-item-' . $cat->term_id;
                    if ( $args[ 'current_category' ] == $cat->term_id ) {
                        $output .= ' current-cat';
                    }
                    if ( $args[ 'has_children' ] && $args[ 'hierarchical' ] ) {
                        $output .= ' cat-parent';
                    }
                    if ( $args[ 'current_category_ancestors' ] && $args[ 'current_category' ] && in_array( $cat->term_id, $args[ 'current_category_ancestors' ] ) ) {
                        $output .= ' current-cat-parent';
                    }
    
                    $thumbnail_id = get_woocommerce_term_meta( $cat->term_id, 'thumbnail_id', true );
                    $img_url= wp_get_attachment_url( $thumbnail_id );
                    $image = ! empty($img_url) ?  '<img class="wpp-term-thumb" src="' . $img_url . '" alt="" />' : '';
    
                    $output .= '"><a href="' . get_term_link( (int) $cat->term_id, $this->tree_type ) . '">'  . $image . _x( $cat->name, 'product category name', 'woocommerce' ) . '</a>';
                    if ( $args[ 'show_count' ] ) {
                        $output .= ' <span class="count">(' . $cat->count . ')</span>';
                    }
                }
    
                public function end_el(&$output, $cat, $depth = 0, $args = array()) {
                    $output .= "</li>\n";
                }
    
                public function display_element($element, &$children_elements, $max_depth, $depth = 0, $args, &$output) {
                    if ( !$element || ( 0 === $element->count && !empty( $args[ 0 ][ 'hide_empty' ] ) ) ) {
                        return;
                    }
                    parent::display_element( $element, $children_elements, $max_depth, $depth, $args, $output );
                }
            }
        endif;


    В functions.php или где то еще, делаем так

    function wpp_change_widget_product_categories_walker($array) {
    
            require_once 'Путь_к_файлу_с_добаленным_классом';
    
            $array[ 'walker' ] = new WPP_WC_Product_Cat_List_Walker_With_Thumb;
    
            return $array;
    
        }
    
        add_filter('woocommerce_product_categories_widget_args','wpp_change_widget_product_categories_walker');
    Ответ написан
    Комментировать
  • Как изменить расположение описания на странице товара Woocommerce?

    wppanda5
    @wppanda5 Куратор тега WooСommerce
    WordPress Mедведь
    Судя по всему, в вашей теме переопределен вывод блоков, скорее всего хуками.
    В дефолтном WooCommerce табы идут как раз снизу. и подвешены на экшен 'woocommerce_after_single_product_summary' с приоритетом 10. В вашем же случае, они повешены на 'woocommerce_single_product_summary' с не понятным приоритетом, но думается, мне, что он 70

    Соответственно, вам надо вернуть все в зад.

    function wpp_reset_product_data_tabs_position(){
    // тут возможно и не 70, надо поиграться с этим параметром, или найти приоритет указанный в теме
    remove_action( 'woocommerce_single_product_summary' ,'woocommerce_output_product_data_tabs', 70);
    //тут именно так
    add_action( 'woocommerce_after_single_product_summary' ,'woocommerce_output_product_data_tabs', 10);
    }
    // тут с приоритетом можно поиграться, но думается мне 100 вполне хватит
    add_action('init','wpp_reset_product_data_tabs_position',100);
    Ответ написан
    Комментировать
  • Как вывести на WP доп. поля к изображениям?

    wppanda5
    @wppanda5 Куратор тега WordPress
    WordPress Mедведь
    Судя по этому 'cr_upload', вы используете мой старый плагин, к сожалению, я тогда был глуп и хранил в поле именно URL а не id, пиши я его в данный момент, я бы сохранил как массив, из id, url, alt и title.

    Получить id можно следующим образом

    $url = get_post_meta(get_the_ID(),'cr_upload',true);
    $attachment = $wpdb->get_col($wpdb->prepare("SELECT ID FROM $wpdb->posts WHERE guid='%s';", $url )); 
    return $attachment[0];


    ну а зная id можете вытащить по нему уже все что, угодно.

    UPD: Вроде нашел исходник
    Это оно ?
    ed47467dd6.jpg
    Если хотите, могу вечером слегка подправить его.
    Ответ написан
  • Как сделать ajax подгрузку, сначала при нажатии а потом скролле?

    wppanda5
    @wppanda5 Куратор тега WordPress
    WordPress Mедведь
    Вот Билл Эрриксон скомпилированный под вашу задачу.
    php
    /**
         * Javascript for Load More
         *
         */
        function be_load_more_js() {
    
            if ( !is_singular( 'post' ) )
                return;
            $query = array(
                'post__not_in'   => array( get_queried_object_id() ),
                'category_name'  => ea_first_term( 'category', 'slug' ),
                'posts_per_page' => 3
            );
            $args = array(
                'url'   => admin_url( 'admin-ajax.php' ),
                'query' => $query,
            );
            wp_enqueue_script( 'be-load-more', get_stylesheet_directory_uri() . '/js/load-more.js', array( 'jquery' ), '1.0', true );
            wp_localize_script( 'be-load-more', 'beloadmore', $args );
    
        }
    
        add_action( 'wp_enqueue_scripts', 'be_load_more_js' );
    
        /**
         * AJAX Load More
         *
         */
        function be_ajax_load_more() {
            $args = isset( $_POST[ 'query' ] ) ? array_map( 'esc_attr', $_POST[ 'query' ] ) : array();
            $args[ 'post_type' ] = isset( $args[ 'post_type' ] ) ? esc_attr( $args[ 'post_type' ] ) : 'post';
            $args[ 'paged' ] = esc_attr( $_POST[ 'page' ] );
            $args[ 'post_status' ] = 'publish';
            ob_start();
            $loop = new WP_Query( $args );
            if ( $loop->have_posts() ): while ( $loop->have_posts() ): $loop->the_post();
                be_post_summary();
            endwhile; endif;
            wp_reset_postdata();
            $data = ob_get_clean();
            wp_send_json_success( $data );
            wp_die();
        }
    
        add_action( 'wp_ajax_be_ajax_load_more', 'be_ajax_load_more' );
        add_action( 'wp_ajax_nopriv_be_ajax_load_more', 'be_ajax_load_more' );
    
        /**
         * First Term
         * Helper Function
         */
        function ea_first_term($taxonomy, $field) {
            $terms = get_the_terms( get_the_ID(), $taxonomy );
    
            if ( empty( $terms ) || is_wp_error( $terms ) )
                return false;
    
            // If there's only one term, use that
            if ( 1 == count( $terms ) ) {
                $term = array_shift( $terms );
            } else {
                $term = array_shift( $list );
            }
    
            // Output
            if ( $field && isset( $term->$field ) )
                return $term->$field;
    
            else
                return $term;
    
        }

    js
    jQuery(function ($) {
    
            $('.post-listing').append('<span class="load-more">Click here to load earlier stories</span>');
            var button = $('.post-listing .load-more');
            var page = 2;
            var loading = false;
            var scroll = false;
            var scrollHandling = {
                allow: true,
                reallow: function () {
                    scrollHandling.allow = true;
                },
                delay: 400 //(milliseconds) adjust to the highest acceptable value
            };
    
            function morer() {
                if (!loading) {
                    loading = true;
                    var data = {
                        action: 'be_ajax_load_more',
                        page: page,
                        query: beloadmore.query,
                    };
                    $.post(beloadmore.url, data, function (res) {
                        if (res.success) {
                            $('.post-listing').append(res.data);
                            $('.post-listing').append(button);
                            page = page + 1;
                            loading = false;
                        } else {
                            // console.log(res);
                        }
                    }).fail(function (xhr, textStatus, e) {
                        // console.log(xhr.responseText);
                    });
                }
            }
    
    
            $('body').on('click', '.load-more', function () {
                if (scroll === false) {
                    morer();
                   $('.load-more').remove();
                    scroll = true;
                }
            });
    
            $(window).scroll(function () {
                if (scroll === true) {
                    if (!loading && scrollHandling.allow) {
                        scrollHandling.allow = false;
                        setTimeout(scrollHandling.reallow, scrollHandling.delay);
                        var offset = $(button).offset().top - $(window).scrollTop();
                        if (2000 > offset) {
                            morer();
                        }
                    }
                }
            });
    
        });
    Ответ написан
    1 комментарий
  • Не могу изменить текст около значка корзины на сайте Wordpress?

    wppanda5
    @wppanda5 Куратор тега WordPress
    WordPress Mедведь
    Потому что там срабатывает get_refreshed_fragment В которой отрабатывает функция woocommerce_mini_cart() которая в свою очередь подключает шаблон templates/cart/mini-cart.php В котором и находится искомое Вами.

    Однако по правильному переводы в WP делаются не так, а так
    Ответ написан
    6 комментариев
  • Как передать данные с формы с помощью ajax php скрипту в wordpress?

    wppanda5
    @wppanda5 Куратор тега WordPress
    WordPress Mедведь
    Ajax на морде сайта работает так, как собрать данные с формы, и отправить их почтой думаю сообразите, оно ничем не отличается от обычной отправки

    PHP подключение скрипта с запуском AJAX и обработчик
    <?php
    #Подключение JS
        function my_enqueue_js() {
            #Скрипт с обработчиком код скрипта ниже
            wp_enqueue_script( 'my-ajax', get_template_directory_uri() . '/assets/js/my-ajax.js', array('jquery'), '1.0.0', true );
            #Отпрака переменных в скрипт
            wp_localize_script( 'my-ajax', 'MyAjax', array(
                'ajax_url' => admin_url( 'admin-ajax.php' ),
                'security' => wp_create_nonce( 'my-security-string' )
            ));
        }
    
        add_action( 'wp_enqueue_scripts', 'my_enqueue_js' );
    
        #Обработчик
        function my_action_callback() {
            check_ajax_referer( 'my-security-string', 'security' );
            $int = intval( $_POST['int'] );
            $int += 10;
            echo $int;
            wp_die();
        }
    
        #Добавление обработчика
        #  вешается на wp_ajax_{имя_экшена}
        # имя экшена должно совпадать с тем, которое задано  в js
        add_action( 'wp_ajax_my_action', 'my_action_callback' );
        #не забываем про nopriv для неавторизованных юзерей
        add_action( 'wp_ajax_nopriv_my_action', 'my_action_callback' );


    Скрипт my-ajax.js в данном примере должен лежать по адресу
    КОРЕНЬ_ТЕМЫ/assets/js/my-ajax.js
    jQuery(document).ready(function($) {
    
      var $data = {
        action: 'my_action',
        security : MyAjax.security,
        int: 1234
      };
    
      $.post(MyAjax.ajax_url, $data, function($response) {
        alert('1234 + 10  =  ' + $response);
      });
      
    });
    Ответ написан
    2 комментария
  • Стоит ли брать SEO Yoast Премиум версия для WordPress?

    wppanda5
    @wppanda5 Куратор тега WordPress
    WordPress Mедведь
    На ваше усмотрение, но ничего сильно полезного там нет в премум версии
    Ответ написан
    Комментировать
  • Wordpress сделать выборку страниц?

    wppanda5
    @wppanda5 Куратор тега WordPress
    WordPress Mедведь
    главной и страницах каталога и категорий каталога.

    Учим матчасть
    if( is_front_page() || is_woocommerce() ) { }
    Ответ написан