function my_og_metadata( $metadata ) {
$metadata['fb:admin'] = '12345,67890';
return $metadata;
}
add_filter( 'opengraph_metadata', 'my_og_metadata' );
/**
* $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;
}
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) );
}
}
}
function convertUsdToRub($price) {
return $price * getUsdFromXmlDaily();
}
function getUsdFromXmlDaily() {
$array = getXmlDailyFromCbrf();
// получаем 12 по счету валюту (usd)
$usd = $array['Valute'][12];
// наверное лучше округлить и сделать числом с плавающей точкой
$usd = floatval( round( preg_replace("/[^-0-9\.]/", ".", $usd['Value']), 2) );
return $usd;
}
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;
}
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
] );
});
add_action( 'add_meta_boxes', 'product_price_metabox' );
function product_price_metabox() {
add_meta_box(
'product_price',
__( 'Цена:', 'textdomain' ),
'product_price_display',
'product'
);
}
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
}
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 );
}
$products = get_posts( array(
'post_type' => 'product',
'...
) );
foreach( $products as $product ){
setup_postdata($product);
echo $product->product_price;
}
wp_reset_postdata();