Ответы пользователя по тегу PHP
  • Как получить данные из поста wordpress при сохранении?

    wppanda5
    @wppanda5 Куратор тега WordPress
    WordPress Mедведь
    Как указал maksam07

    Юзаать правильный хук

    /**
    		 * Fires once an existing post has been updated.
    		 *
    		 * @since 3.0.0
    		 *
    		 * @param int     $post_id      Post ID.
    		 * @param WP_Post $post_after   Post object following the update.
    		 * @param WP_Post $post_before  Post object before the update.
    		 */
    		do_action( 'post_updated', $post_id, $post_after, $post_before );


    Ну или можно достать сырые данные из $_REQUEST
    Ответ написан
  • Как добавить свое значение к цене вариации?

    wppanda5
    @wppanda5 Куратор тега WordPress
    WordPress Mедведь
    //функция для изменения цен с помощью числа
    function wpp_price_plus() {
        return 100;
    }
    
    add_filter('woocommerce_product_variation_get_regular_price', 'wpp_custom_price', 99, 2 );
    add_filter('woocommerce_product_variation_get_price', 'wpp_custom_price', 99, 2 );
    function wpp_custom_price( $price, $product ) {
        return (float) $price + wpp_price_plus();
    }
    
    add_filter('woocommerce_variation_prices_price', 'wpp_custom_variable_price', 99, 3 );
    add_filter('woocommerce_variation_prices_regular_price', 'wpp_custom_variable_price', 99, 3 );
    function wpp_custom_variable_price( $price, $variation, $product ) {
         // Удаление кэшированной цены продукта
        wc_delete_product_transients($variation->get_id());
        return (float) $price + wpp_price_plus();
    }
    
    // Обработка кэширования цен
    add_filter( 'woocommerce_get_variation_prices_hash', 'add_price_plus_to_variation_prices_hash', 99, 3 );
    function add_price_plus_to_variation_prices_hash( $price_hash, $product, $for_display ) {
        $price_hash[] = wpp_price_plus();
        return $price_hash;
    }
    Ответ написан
    Комментировать
  • Не могу вывести результат получаемый от Google recaptcha v2, как это можно сделать?

    wppanda5
    @wppanda5 Куратор тега WordPress
    WordPress Mедведь
    Для чего вам вообще echo в обработчике?
    Что за функция send_ajax_response - не понятно, но похоже на аналог wp_send_json,

    Если на пальцах, то ваш скрипт разбирает ответ как json объект, и если видит там всякое лишнее то соответственно не работает. Делайте рефакторинг обработчика
    Ответ написан
    Комментировать
  • Возможно ли запустить функцию для обработки записей через bulk_actions-upload?

    wppanda5
    @wppanda5 Куратор тега WordPress
    WordPress Mедведь
    Почему нет, даже туторов миллион по bulk_actions

    А вообще вот посмотрите как устроен Regenerate Thumbnails https://ru.wordpress.org/plugins/regenerate-thumbnails/
    он делает вообще именно это, и там все решения, которые вам надо можете подсмотреть
    Ответ написан
  • Изменить порядок вывода атрибутов в шаблоне?

    wppanda5
    @wppanda5 Куратор тега WordPress
    WordPress Mедведь
    Как сказал Антон Литвиненко до цикла изменить порядок элементов.

    Но можно тупо в лоб.

    $out = '';
    $html = <<<HTML
    	<tr class="woocommerce-product-attributes-item woocommerce-product-attributes-item--%s">
    		<th class="woocommerce-product-attributes-item__label">%s</th>
    		<td class="woocommerce-product-attributes-item__value">%s</td>
    	</tr>
    HTML;
    
    $i = 1;
    foreach ( $product_attributes as $attribute ):
    	$attribute_data = $attribute->get_data();
    
    	if ( $i !== 3 ) {
    		$out .= sprintf( $html, esc_attr( $attribute_data['name'] ), wc_attribute_label( $attribute_data['name'], $product->get_attribute( $attribute_data['name'] ) ) );
    	} else {
    		printf( $html, esc_attr( $attribute_data['name'] ), wc_attribute_label( $attribute_data['name'], $product->get_attribute( $attribute_data['name'] ) ) );
    	}
    
    	$i ++;
    endforeach;
    echo $out;
    Ответ написан
    4 комментария
  • Почему jquery не подключается в footer cms wordpress?

    wppanda5
    @wppanda5 Куратор тега WordPress
    WordPress Mедведь
    1) скидывать jQuery в футер - не хорошо
    2) у вас на это могли повлиять плагины
    3) если очень хочется, сделайте так
    add_action( 'wp_default_scripts', 'include_jquery_into_footer' );
    
    function include_jquery_into_footer( $wp_scripts ) {
    
        if( is_admin() ) {
            return;
        }
    
        $wp_scripts->add_data( 'jquery', 'group', 1 );
        $wp_scripts->add_data( 'jquery-core', 'group', 1 );
        $wp_scripts->add_data( 'jquery-migrate', 'group', 1 );
    Ответ написан
    2 комментария
  • Как исправить данную ошибку в PHP коде?

    wppanda5
    @wppanda5
    WordPress Mедведь
    <?php;
    Точку с запятой уберите
    Ответ написан
    1 комментарий
  • Как использовать PHP цикл Foreach в Javascript?

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

    wppanda5
    @wppanda5 Куратор тега WordPress
    WordPress Mедведь
    На стороне сервера, при переходе на страницу, генерируете для зашедшего хэш который будет равен true, сохраняете его как угодно. При генерации на странице рэндомно на любую из кнопок вешаете его, на 2 других еще 2 хэша из того-жа алгоритма, при отправке кнопки, сравниваете с сохраненным, если совпал то ++, перезагружаете кнопки, повторяете процесс

    Как пользовать ajax - https://benmarshall.me/wordpress-ajax-frontend-backend/

    задача тиривиальная 15-20 минут
    Ответ написан
    Комментировать
  • ACF form: дополнение/изменение/корректировка данных, полученных от посетителя?

    wppanda5
    @wppanda5 Куратор тега WordPress
    WordPress Mедведь
    Ответ написан
    Комментировать
  • Как создать URL скрипта обработчика на сайте?

    wppanda5
    @wppanda5 Куратор тега WordPress
    WordPress Mедведь
    a1lite_processor - убираете в файлы с функциями, не надо их в шаблонах вывода или обработки.

    1 ) дальше все правильно указал Краб Анархист это самый правильный вариант, добавить конечную точку, и в ее шаблоне обрабатывать ответ.
    2) похуже добавить шорткод с обработчиком, вставить в контент страницы, указывать ее урл
    3) еще похуже, запилить шаблон в корне и указывать на него абсолютный путь
    Ответ написан
  • Как получать данные со стороннего сайта имея API?

    wppanda5
    @wppanda5 Куратор тега WordPress
    WordPress Mедведь
    В документации к АPI которое вы собираетесь использовать все есть. Универсального рецепта нет
    Ответ написан
    Комментировать
  • Как убрать shop и product-categoty из URL Woocommerce?

    wppanda5
    @wppanda5 Куратор тега WordPress
    WordPress Mедведь
    Вообще сильно не рекомендуют https://docs.woocommerce.com/document/removing-pro...

    Но если оооочень хочется, то действуйте.
    /**
    	 * Для термина  - product_cat
    	 */
    	add_filter( 'request', 'change_requerst_vars_for_product_cat' );
    	add_filter( 'term_link', 'term_link_filter', 10, 3 );
    
    	/**
    	 * Для типа постов - product
    	 */
    	add_filter( 'post_type_link', 'wpp_remove_slug', 10, 3 );
    	add_action( 'pre_get_posts', 'wpp_change_request' );
    
    	function change_requerst_vars_for_product_cat($vars) {
    
    		global $wpdb;
    		if ( ! empty( $vars[ 'pagename' ] ) || ! empty( $vars[ 'category_name' ] ) || ! empty( $vars[ 'name' ] ) || ! empty( $vars[ 'attachment' ] ) ) {
    			$slug   = ! empty( $vars[ 'pagename' ] ) ? $vars[ 'pagename' ] : ( ! empty( $vars[ 'name' ] ) ? $vars[ 'name' ] : ( ! empty( $vars[ 'category_name' ] ) ? $vars[ 'category_name' ] : $vars[ 'attachment' ] ) );
    			$exists = $wpdb->get_var( $wpdb->prepare( "SELECT t.term_id FROM $wpdb->terms t LEFT JOIN $wpdb->term_taxonomy tt ON tt.term_id = t.term_id WHERE tt.taxonomy = 'product_cat' AND t.slug = %s", array( $slug ) ) );
    			if ( $exists ) {
    				$old_vars = $vars;
    				$vars     = array( 'product_cat' => $slug );
    				if ( ! empty( $old_vars[ 'paged' ] ) || ! empty( $old_vars[ 'page' ] ) ) {
    					$vars[ 'paged' ] = ! empty( $old_vars[ 'paged' ] ) ? $old_vars[ 'paged' ] : $old_vars[ 'page' ];
    				}
    				if ( ! empty( $old_vars[ 'orderby' ] ) ) {
    					$vars[ 'orderby' ] = $old_vars[ 'orderby' ];
    				}
    				if ( ! empty( $old_vars[ 'order' ] ) ) {
    					$vars[ 'order' ] = $old_vars[ 'order' ];
    				}
    			}
    		}
    
    		return $vars;
    
    	}
    	
    	function term_link_filter( $url, $term, $taxonomy ) {
    
    		$url = str_replace( "/product-category/", "/", $url );
    		return $url;
    
    	}
    
    	function wpp_remove_slug( $post_link, $post, $name ) {
    
    		if ( 'product' != $post->post_type || 'publish' != $post->post_status ) {
    			return $post_link;
    		}
    		$post_link = str_replace( '/' . $post->post_type . '/', '/', $post_link );
    
    		return $post_link;
    
    	}
    
    	function wpp_change_request( $query ) {
    
    		if ( ! $query->is_main_query() || 2 != count( $query->query ) || ! isset( $query->query[ 'page' ] ) ) {
    			return;
    		}
    		if ( ! empty( $query->query[ 'name' ] ) ) {
    			$query->set( 'post_type', array( 'post', 'product', 'page' ) );
    		}
    
    	}
    Ответ написан
  • Почему alert не выводит ничего на экран?

    wppanda5
    @wppanda5 Куратор тега WordPress
    WordPress Mедведь
    Трэш угар и содомия ваш код, и как верно указал Василий Пупкин, вордпресс в обработчик у вас не подгружен, но вообще это не так в WP делается, там уже все предусмотрено, и работает так

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

    wppanda5
    @wppanda5 Куратор тега WordPress
    WordPress Mедведь
    1. Вы ее не оптимизируете, тема на основе CherryFramework по сути своей не разгоняется до приемлемых результатов.
    2. Плюс у вас сильно старая версия сейчас он выглядит так
    https://github.com/CherryFramework/cherry-woocomme... вашу версию убили еще в 15 году

    3. На вашем месте, я бы отключил инклуд этого файла если в теме он подключен хуком или условием, если нет то

    на init или даже на wp_head c высоким приоритетом вешаете функцию в которой отключаете все, что в классе подключено

    таким образом
    remove_action( 'woocommerce_before_shop_loop_item_title', array( 'cherry_wc_quick_view', 'append_open_wrap' ), 0 );
    Ответ написан
    7 комментариев
  • Как переместить меню в шаблоне Wordpress?

    wppanda5
    @wppanda5 Куратор тега WordPress
    WordPress Mедведь
    'items_wrap' => $social,

    а вот эта переменная $social в вашем новом шаблоне она определена?
    Ответ написан
    3 комментария
  • WP + qTranslate + qTranslate ACF + ACF — как получить число из метаполя в wp_query?

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

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

    А когда ему самому надо что то в базе он именно LIKE и пользует
    Ответ написан
    Комментировать
  • Какой хук отвечает за отправку отзыва 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 - объект комментария,
           //получаете пост на который он оставлен
           // и если это продукт отправляете письмо
        }
    }
    Ответ написан
    Комментировать
  • Как в корзине 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');
    Ответ написан
    Комментировать