В Woocommerce foreach цикл работает, но создает ошибки в журнале

Ruth спросил: 28 апреля 2018 в 09:11 в: php

Я использую следующий код, который создает красивую таблицу под сводкой продуктов на странице одного продукта, однако это вызывает ошибки журнала, которые, по-видимому, замедляют работу сайта. Может ли кто-нибудь сказать мне, что я сделал неправильно?

Ошибки заключаются в следующем:

[22-May-2018 10:39:51 UTC] PHP Предупреждение: Недопустимый аргумент, предоставленный foreach () в /www1/84b/www.dizzydev9.co.uk/web/wp-content/themes/IHS/functions.php в строке 750

Связанный код:

add_action('woocommerce_after_single_product_summary', function() {global $product;
$mols700ma_values = get_the_terms( $product->id, 'pa_mol-s700ma');
$mols300ma_values = get_the_terms( $product->id, 'pa_mol-s300ma');
$fluxtotal_values = get_the_terms( $product->id, 'pa_total-radiometric-flux-mw');
$din5031300_values = get_the_terms( $product->id, 'pa_din5031-10-360-780nm');
$din5031700_values = get_the_terms( $product->id, 'pa_din5031-10-400-700nm');
$mccree300_values = get_the_terms( $product->id, 'pa_adjusted-mccree-360-780nm');
$mccree700_values = get_the_terms( $product->id, 'pa_adjusted-mccree-400-700');echo '<table id="parametrics"><tr>
<th class="rotate"><div><span>240-790nm Total radiometric flux (mW)</span> 
</div></th>
<th class="rotate"><div><span>PAR 400-700nm PPF µmol/s</span></div></th>
<th class="rotate"><div><span>PAR 360-780nm BPF µmol/s</span></div></th>
<th class="rotate"><div><span>PAR (adjusted DIN5031-10) 400-700nm BPF 
µmol/s</span></div></th>
<th class="rotate"><div><span>PAR (adjusted DIN5031-10) 360-780nm BPF 
µmol/s</span></div></th>
<th class="rotate"><div><span>PAR (adjusted McCree) 400-700nm BPF 
µmol/s</span></div></th>
<th class="rotate"><div><span>PAR (adjusted McCree) 360-780nm BPF 
µmol/s</span></div></th>
</tr>';
  echo '<tr><td>' ;
foreach ( $fluxtotal_values as $fluxtotal_value ) {
    echo $fluxtotal_value->name;
}
echo'</td><td>';    
foreach ( $mols700ma_values as $mols700ma_value ) {
    echo $mols700ma_value->name;
}
echo'</td><td>';
foreach ( $mols300ma_values as $mols300ma_value ) {
    echo $mols300ma_value->name;
}
echo'</td><td>';
foreach ( $din5031700_values as $din5031700_value ) {
    echo $din5031700_value->name;
}
echo'</td><td>';
foreach ( $din5031300_values as $din5031300_value ) {
    echo $din5031300_value->name;
}
echo'</td><td>';
foreach ( $mccree700_values as $mccree700_value ) {
    echo $mccree700_value->name;
}
echo'</td><td>';        
foreach ( $mccree300_values as $mccree300_value ) {
    echo $mccree300_value->name;
}
echo'</td></tr></table>';
}, 1);

1 ответ

LoicTheAztec ответил: 29 апреля 2018 в 11:53

Наконец-то я нашел источник ошибок вашей проблемы: вам нужно проверить, что каждый массив терминов не пуст до цикла foreach, чтобы избежать ошибки.

Я решил полностью пересмотреть ваш код, в очень компактном виде. Попробуйте:

add_action('woocommerce_after_single_product_summary', 'product_attributes_custom_table', 1 );
function product_attributes_custom_table() {
    global $product;    $product_attributes = array();    // Set product attribute taxonomy and labels pairs in an array
    $keys_labels = array(
        'pa_total-radiometric-flux-mw'  => __('240-790nm Total radiometric flux (mW)'),
        'pa_mol-s700ma'                 => __('PAR 400-700nm PPF µmol/s'),
        'pa_mol-s300ma'                 => __('PAR 360-780nm BPF µmol/s'),
        'pa_din5031-10-400-700nm'       => __('PAR (adjusted DIN5031-10) 400-700nm BPF µmol/s'),
        'pa_din5031-10-360-780nm'       => __('PAR (adjusted DIN5031-10) 360-780nm BPF µmol/s'),
        'pa_adjusted-mccree-400-700'    => __('PAR (adjusted McCree) 400-700nm BPF µmol/s'),
        'pa_adjusted-mccree-360-780nm'  => __('PAR (adjusted McCree) 360-780nm BPF µmol/s'),
    );    // Loop through the array
    foreach( $keys_labels as $key => $label ){
        if( taxonomy_exists($key) ){
            $terms = get_the_terms( $product->get_id(), $key );
            if($terms){
                // Change $terms in a coma separated list of term names
                $term_names = join(', ', wp_list_pluck($terms, 'name'));
                // Set label and the coresponding term names in the array
                $product_attributes[$label] = $term_names;
            }
        }
    }    echo '<table id="parametrics"><tr>';    // First loop for the labels
    foreach($product_attributes as $label => $term_names ){
        echo '<th class="rotate"><div><span>'.$label.'</span></div></th>';
    }    echo '</tr><tr>';    // Second loop for the term names
    foreach($product_attributes as $label => $term_names ){
        echo '<td>'.$term_names.'</td>';
    }    echo'</td></tr></table>';
}

Код идет в файле function.php вашей активной дочерней темы (или активной темы). Протестировано и работает.

Ruth ответил: 28 апреля 2018 в 12:25
Спасибо за это, к сожалению, это все еще создает ошибку
LoicTheAztec ответил: 29 апреля 2018 в 11:35
@Ruth Я нашел, в чем была проблема ... Я также полностью переделал ваш код, просто для удовольствия ... Попробуйте его и верните мне. Благодарю.
Ruth ответил: 29 апреля 2018 в 11:55
Привет, это большое спасибо. Он также показывает только столбцы, если у них есть данные, поэтому гораздо лучшее решение.