add_action( 'woocommerce_admin_order_data_after_order_details', 'warrenty_price_order_meta_general' );
function warrenty_price_order_meta_general( $order ){ ?>
<br class="clear" />
<h4>Gift Order <a href="#" class="edit_address">Edit</a></h4>
<?php
/*
* get all the meta data values we need
*/
[110] Для электронной почты
add_action('woocommerce_email_order_meta', 'warrenty_price_email_order_meta', 10, 3);
function warrenty_price_email_order_meta($order_obj, $sent_to_admin, $plain_text) {
$warrenty_price = get_post_meta($order_obj->get_id(), '_warrenty_price', true);
if (empty($warrenty_price))
return;
if ($plain_text === false) {
echo '<h2>Warranty</h2>
<ul>
<li><strong>Price:</strong> ' . $warrenty_price . '</li>
</ul>';
} else {
echo "Warranty\n
Price: $warrenty_price";
}
}
warrenty_price = get_post_meta( $order->get_id(), '_warrenty_price', true );
?>
<div class="address">
<p><strong>Warranty</strong></p>
<?php
if( [110] Для электронной почты
add_action('woocommerce_email_order_meta', 'warrenty_price_email_order_meta', 10, 3);
function warrenty_price_email_order_meta($order_obj, $sent_to_admin, $plain_text) {
$warrenty_price = get_post_meta($order_obj->get_id(), '_warrenty_price', true);
if (empty($warrenty_price))
return;
if ($plain_text === false) {
echo '<h2>Warranty</h2>
<ul>
<li><strong>Price:</strong> ' . $warrenty_price . '</li>
</ul>';
} else {
echo "Warranty\n
Price: $warrenty_price";
}
}
warrenty_price ) :
?>
<p><strong>Price:</strong> <?php echo [110] Для электронной почты
add_action('woocommerce_email_order_meta', 'warrenty_price_email_order_meta', 10, 3);
function warrenty_price_email_order_meta($order_obj, $sent_to_admin, $plain_text) {
$warrenty_price = get_post_meta($order_obj->get_id(), '_warrenty_price', true);
if (empty($warrenty_price))
return;
if ($plain_text === false) {
echo '<h2>Warranty</h2>
<ul>
<li><strong>Price:</strong> ' . $warrenty_price . '</li>
</ul>';
} else {
echo "Warranty\n
Price: $warrenty_price";
}
}
warrenty_price ?></p>
<?php
endif;
?>
</div>
<?php } ?>
Для электронной почты
add_action('woocommerce_email_order_meta', 'warrenty_price_email_order_meta', 10, 3);
function warrenty_price_email_order_meta($order_obj, $sent_to_admin, $plain_text) {
$warrenty_price = get_post_meta($order_obj->get_id(), '_warrenty_price', true);
if (empty($warrenty_price))
return;
if ($plain_text === false) {
echo '<h2>Warranty</h2>
<ul>
<li><strong>Price:</strong> ' . $warrenty_price . '</li>
</ul>';
} else {
echo "Warranty\n
Price: $warrenty_price";
}
}
Небольшая заметка, хотя и очень редкая, но я обнаружил несколько случаев, когда я считают, что компилятор Comeau ошибается - хотя эти случаи настолько редки, что всегда стоит вдвое и втрое проверяю ваши предположения!
Возможно, у меня есть причина поведения g ++. Я не уверен, что это точно указывается при настройке типов параметров:
Примите во внимание следующее:
template<typename T>
struct A
{
void bar (T[10]);
};
template<typename T>
void A<T>::bar (T*)
{
}
Определение «bar» допустимо, поскольку «T [10]» распадается на «T *». я делаю не вижу в стандарте ничего, что запрещает компилятору выполнение корректировок 8.3.5 относительно шаблона объявления, а также повышает производительность, когда дело доходит до сопоставления перегрузки.
Применяя это к вашему примеру, g ++ может рассматривать его как:
template<typename T>
char (&f( T* ))[1];
template<typename T>
char (&f(...))[2];
int main() { char c[sizeof(f<void()>(0)) == 2]; }
В приведенном выше замещаемом параметре является допустимый указатель на функция, а не массив функций.
Итак, вопрос для меня - есть ли что-то, что запрещает корректировки параметров функции (8.3.5) дважды?
Лично я считаю, что имеет смысл разрешить корректировки дважды, так как в противном случае это усложняет сопоставление шаблона функции overloads
В заключение, я думаю, что для g ++ допустимо выбрать первую перегрузку основываясь на том, как он обрабатывает параметры распадающегося массива, и Комо ошибается не иметь ошибки вывода для массива функций.
Конечно, теперь это означает, что (если Комо был исправлен), то каждый компилятор выбрал бы другую перегрузку и все равно был бы стандартом совместимый! : (
РЕДАКТИРОВАТЬ:
Чтобы проиллюстрировать мою точку зрения, рассмотрим следующий код:
template <typename T> void foo ( T * );
template <typename T> void foo ( T * const );
template <typename T> void foo ( T [] );
template <typename T> void foo ( T [10] );
template <typename T> void foo ( T [100] );
void bar ()
{
foo < void() > ( 0 );
}
Здесь foo был объявлен и повторно объявлен несколько раз. Какое объявление и, следовательно, какой тип параметра, должен компилятор применять правила перечислен в 14.8.2?
Я хочу сказать, что стандарт ничего не говорит о вышеизложенном. Я бы также сказал, что любая формулировка по этому поводу должна была бы оставить это либо как «undefined», либо « "поведение, определяемое реализацией".
Довольно удивительно - это работает в VS2008. Я не думаю, что это обязательно свидетельствует о том, что это правильное поведение или нет ...
Visual Studio интерпретирует
char (&f(T[1]))[1];
как функцию, которая принимает массив размером 1 T и возвращает ссылку на массив символы размера 1.
Как правило, вы не можете редактировать файл на месте; это просто очень длинная последовательность символов, которая включает символы новой строки. Вы можете редактировать на месте, если ваши изменения не меняют количество символов в каждой строке.
следовательно, разрешение перегрузки возвращает вторую перегрузку. Я не верю, что программа плохо сформирована.