Задать вопрос
  • Почему я не могу перейти на страницу оформления заказа?

    Не обязательно. Смотря как тема собрана. А собрать ее можно по разному. Файла woocommerce.php может вообще не быть. Также, как и woocommerce_content().

    Например тут - https://wp-kama.ru/plugin/woocommerce/function/woo...
    "This function is only used in the optional 'woocommerce.php' template. which people can add to their themes to add basic woocommerce support. without hooks or modifying core templates".

    То есть, хотите используйте, хотите нет. Я чаще не использую, если предполагается "кастом". Мне проще компоненты woocommerce править, как мне нужно.
  • Почему я не могу перейти на страницу оформления заказа?

    Попробуйте сделать так -
    в functions.php закомментируйте код, который в пункте 4.
    Файл woocommerce.php перенесите в корень темы из каталога functions
  • Почему я не могу перейти на страницу оформления заказа?

    Ок. Тогда вернусь к вопросу - у вас сразу после установки woo полезли ошибки? Или сначала было все нормально, но потом полезли ошибки?
    Из вашего ответа я также понимаю, что кроме оформления заказа, еще и страница аккаунта выводится не там. Возможно, это еще не все ошибки.
    Тут может быть все, что угодно. А мы ведь весь проект не видим. И не понятно, за что "дергать".
  • Почему я не могу перейти на страницу оформления заказа?

    Понятно. Если вы сами тему собираете, то таких вопросов будет много. Нам придется много раз у вас спрашивать, а что у вас там или там... В общем, намучаетесь.
    Может быть, есть смысл сгенерировать тему, например тут - https://underscores.me/ , с поддержкой woocommerce.
  • Почему я не могу перейти на страницу оформления заказа?

    Работало-ли изначально после установки темы и магазина?
    Если работало - после каких ваших действий перестало работать?
  • Почему я не могу перейти на страницу оформления заказа?

    Есть какая-то путаница с вопросом. В вопросе вы написали - не можете перейти на страницу заказа. Это одно. Файл woocommerce.php - здесь может быть вовсе не про то.
    Зачем и где вы выводите шорткод woocommerce_checkout? В каком файле? По умолчанию, он у вас уже прописан на странице оформления заказа в админке, без всяких echo и do_shortcode, просто вот так - [woocommerce_checkout]. И если вы в нем ничего не меняли, то должно все работать.
  • В какой папке должны храниться файлы сайта?

    видимо про файлы темы? Тогда дальше themes/ваша_тема
  • Как вывести id товара на странице товара woocommerce?

    Если я правильно понимаю, плагин вот этот - https://ru.wordpress.org/plugins/opengraph/ ?

    Или не этот? Если не этот - скиньте ссылку на страницу плагина, который вы используете.

    Если этот - там внизу по ссылке, которую я приложил есть, есть раздел ЧАВО. И там есть пример хука:

    function my_og_metadata( $metadata ) {
        $metadata['fb:admin'] = '12345,67890';
        return $metadata;
    }
    add_filter( 'opengraph_metadata', 'my_og_metadata' );


    Судя по описанию, этот хук позволяет добавить свои метаданные в вывод разметки OpenGraph. Например:

    $metadata['fb:id] = $product->get_id();
  • Как вывести id товара на странице товара woocommerce?

    Тут много неясного.

    Во первых, как выше написал Антон, желательно получать ID не post, а product.

    Но, вопрос в том, где и как его получить.

    То, что вы использовали хук woocommerce_before_single_product_summary - не факт, что это поможет, так как вы просто выводите ID в интерфейс. При этом, вы используете elementor, которому может быть все равно на этот хук.

    ID товара нужно выводить в разметку OpenGraph. Откройте исходный код страницы в браузере, посмотрите, что туда выводится. Скорее всего ничего. Я не знаю, как работает плагин OpenGraph, нужно понять, может ли он "цеплять" какие-либо данные из магазина. Возможно, у него есть настройки, которые позволяют "связать" разметку с товарами магазина.
  • Как добавить доп. валюты в Woocommerce?

    Пожалуйста.
    С корзиной - там свои хуки используются, с помощью которых поменять суммы не проблема. Они для того и предназначены.
    А со знаком валюты - корзина по умолчанию работает только с одной системной валютой. Возможно поэтому разработчики woo не особо заморачивались на хуки, связанные с изменением валюты. Поэтому, тут нужно придумывать.

    Еще момент - есть страница корзины, а есть компонент корзины, который насквозь на всех страницах идет. И их нужно "кастомить" отдельно. То есть, если на странице корзины удается что-то поменять, не факт, что компонент корзины правильно "среагирует" на эти изменения.

    Возможно, в корзине поменять будет проще с помощью JavaScript. То есть, не трогать корзину "изнутри", а просто подменить всё что нужно в интерфейсе в html-тегах корзины. Но тут будет другой момент - это зависит от вашей темы. В разных темах корзина может быть "обернута" в разные теги.
  • Как добавить доп. валюты в Woocommerce?

    Для вариаций другой хук (woocommerce_variable_price_html), но с той-же функцией. То есть, одну и ту-же функцию "вешаем" на два фильтра - один для простых товаров, второй для вариаций. Добавил в код примера.

    Для корзины - тут отдельная история, тот вариант, который я предлагал ранее - нерабочий. Поэтому, я его удалил. С корзиной нужно экспериментировать.
  • Как добавить доп. валюты в Woocommerce?

    Для каталога и карточки товара -

    /**
     * $price выводит системную цену со знаком рубля
     * $product->get_price() - цена товара цифрой
     * дописываем USD, EUR... и выводим вместо $price 
     * Это будет работать в каталоге и карточке товара.
     * Но не будет в корзине.
     */
    
    
    // для простых товаров
    add_filter( 'woocommerce_get_price_html', 'change_product_price', 11, 2);
    // для вариаций
    add_filter('woocommerce_variable_price_html', 'change_product_price', 10, 2); 
    function change_product_price( $price, $product ){
    	
    	if( has_term( 'cars', 'product_cat', $product->get_id() ) ) {
    		return $product->get_price() . 'USD';
    	} elseif ( has_term( 'yaht', 'product_cat', $product->get_id() ) ) {
    		return $product->get_price() . 'EUR';
    	}
    
        return $price;
    }
  • Как настроить несколько валют в Woocommerce?

    Да, действительно, валюту в корзине пересчитывать нужно.

    Тогда, в тот же хук обработки корзины в foreach вместо цены добавляем цену в долларах * курс в рублях:

    add_action( 'woocommerce_before_calculate_totals', 'set_custom_price_usd_to_cart', 10, 1 );
    function set_custom_price_usd_to_cart( $cart ){
            if ( is_admin() && ! defined( 'DOING_AJAX' ) )
        	    return;
    
      if ( did_action( 'woocommerce_before_calculate_totals' ) >= 2 )
          return;
    
      foreach ( $cart->cart_contents as $key => $value ) {
                if ( ... проверяем, принадлежит ли товар категории Second... ) {
                    /* если да - меняем цену и пересчитываем по курсу "родной"  валюты */
                    $value['data']->set_price( convertUsdToRub($price_usd) );
                }
            }
    }


    Теперь, нам нужно где-то получать и где-то хранить курс доллара к рублю.

    Получать можно в xml прямо с сайта ЦБ РФ cbr.ru/scripts/XML_daily.asp. Сохранять, например в кэш, брать курс доллара и конвертировать по нему цену.

    Логика может быть любая, например:

    Конвертируем цену в долларах в рубли по курсу ЦБ РФ:

    function convertUsdToRub($price) {
    	return $price * getUsdFromXmlDaily();
    }


    Получаем курс доллара из xml файла. Доллары в xml - это 12-й по счету элемент:

    function getUsdFromXmlDaily() {
    	$array = getXmlDailyFromCbrf();
            // получаем 12 по счету валюту (usd)
    	$usd = $array['Valute'][12];
            // наверное лучше округлить и сделать числом с плавающей точкой
    	$usd = floatval( round( preg_replace("/[^-0-9\.]/", ".", $usd['Value']), 2) );
    
    	return $usd;
    }


    Загружаем xml с сайта cbr.ru и кэшируем на 12 часов:

    function getXmlDailyFromCbrf() {
            // берем из объектного кэша если он есть, или загружаем с http://cbr.ru/scripts/XML_daily.asp
    	$xml_daily = get_transient( 'cbrf_exchange' );
    	$result = json_decode( json_encode( $xml_daily ), TRUE);
    	if( false === $xml_daily ) {
    		$xml_daily = simplexml_load_file( 'http://cbr.ru/scripts/XML_daily.asp' );
    		$result = json_decode( json_encode( $xml_daily ), TRUE);
                    // сохраняем в кэш на сутки
    		set_transient( 'cbrf_exchange', $result, 12 * HOUR_IN_SECONDS );
    	}
            // если нужно очистить кэш
    	//delete_transient('cbrf_exchange');
    	
    	return $result;
    }
  • Почему после успешной оплаты юкасса, при получении Notification выдается ошибка?

    Тогда пошагово -

    1) Что у вас находится в файле payac.php? Я правильно понимаю, что в нем содержимое "При успешной оплате"?

    2) "При успешной оплате" есть строки -
    $requestBody = json_decode($source, true);
    var_dump($source);

    Что выдает var_dump? И что он будет выдавать, если поменять на var_dump($requestBody);

    3) В "Формирование платежа" -
    $fio = $_POST['fio'];
    $email = $_POST["email"];
    Эти два POST тоже нужно проверять, что в них получаете? Проверьте с помощью var_dump();
  • Как грамотно реализовать карточку товара на лэндинге?

    Если не хотите ставить Woo, ACF и вообще обойтись без плагинов, то можно сделать с помощью Custom Fields и Metabox:

    1. Добавляем Custom Type, который будет называться product:
    add_action('init', function() {
    	register_post_type( 'product', [
    		'labels' => [
    			'name' => 'Товар',
    			'singular_name' => 'Товар',
    			'add_new'            => 'Добавить товар',
    			'add_new_item'       => 'Добавить новый товар',
    			'edit_item'          => 'Редактировать товар',
    			'new_item'           => 'Новый товар',
    			'view_item'          => 'Посмотреть товар'
    		],
    		'public' => false,
    		'show_ui' => true,
    		'hierarchical' => false,
    		'supports' => ['title', 'content', 'thumbnail'],
    		'exclude_from_search' => true
    	] );
    });


    То есть, мы "вешаем" создание кастомного типа на хук init.
    Подробнее по аргументам функции погуглите register_post_type

    2. Создаем цену товара с помощью метабокса, для чего вызываем хук add_meta_boxes, в котором привязываем цену к product:

    add_action( 'add_meta_boxes', 'product_price_metabox' );
    function product_price_metabox() {
        add_meta_box( 
            'product_price',
            __( 'Цена:', 'textdomain' ),
            'product_price_display',
            'product'
        );
    }


    3. Создаем функцию, которая будет выводить input с ценой:

    function product_price_display( $post ) {
    
    	// Use nonce for verification
    	wp_nonce_field( basename( __FILE__ ), 'product_price_nonce' );
      
    	// get current value
        	$product_price_value = get_post_meta( get_the_ID(), 'product_price', true );
    	?>
    	<input type="text" 
    		data-id="<?= get_the_ID() ?>"
    		name="product_price"
    		id="product_price" 
    		placeholder="Цена" 
    		value="<?= $product_price_value ?>">
    	<?php
    }


    4. Создаем функцию, которая будет сохранять цену в БД и "вешаем" ее на хук save_post:

    add_action( 'save_post', 'product_price_save' );
    function product_price_save( $post_id ) {
    	
        // if doing autosave don't do nothing
      if ( defined( 'DOING_AUTOSAVE' ) && DOING_AUTOSAVE ) 
          return;
    
      // verify nonce
      if ( !wp_verify_nonce( $_POST['product_price_nonce'], basename( __FILE__ ) ) )
          return;
    
      // Check permissions
      if ( 'page' == $_POST['post_type'] ) 
      {
        if ( !current_user_can( 'edit_page', $post_id ) )
            return;
      }
      else
      {
        if ( !current_user_can( 'edit_post', $post_id ) )
            return;
      }
    
      // save the new value
      $new_value = $_POST['product_price'];
      update_post_meta( $post_id, 'product_price', $new_value );
    }


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

    Выводить на сайте с помощью get_posts() или другого "родного" для WP способа, указав в post_type название вашего Custom Type. Пример:

    $products = get_posts( array(
    	'post_type'   => 'product',
    	'...
    ) );
    
    foreach( $products as $product ){
    	setup_postdata($product);
            echo $product->product_price;
    }
    wp_reset_postdata();


    Подробнее гуглите по каждой функции, информации очень много.
  • Как вывести в консоль функцию?

    Если у вас в app.js - это весь код, то в браузере по localhost:8848 вы результат не получите. Нужно "поднимать" веб-сервер и реализовывать маршрутизацию.

    Пока, чтобы проверить, в командной строке в каталоге с app.js выполните команду:

    node app.js