#wordpress #filter #plugins #self-modifying
Вопрос:
Здравствуйте, я внес некоторые изменения в плагин, но после обновления мне приходится каждый раз менять код. Теперь, как построить фильтр для functions.php. Вот те изменения, которые я сделал.
это всего лишь некоторые переменные изменения. и мне это нужно для правильной синхронизации.
я надеюсь, что кто-нибудь сможет помочь мне построить это:)
Вот код плагина ori Ori:
protected function get_order_items($order) {
$order_items = array();
$incl_tax = get_option('woocommerce_tax_display_cart') == 'incl';
foreach ($order->get_items() as $item) {
if ($incl_tax) {
$price = ($item['line_subtotal'] $item['line_subtotal_tax']) / $item['qty'];
} else {
$price = $item['line_subtotal'] / $item['qty']; // WC3 ($item->get_subtotal()/$item->get_quantity()),
}
$product = $this->get_product_from_item($item);
$data = array(
'sku' => $product ? $product->get_sku() : '',
'name' => $item['name'], // WC3 $item->get_name(),
'quantity' => $item['qty'], // WC3 $item->get_quantity(),
'price' => $this->round_price($price),
'tax_id' => Options::get('bf_tax_' . ($item['tax_class'] ?: 'standard')), // WC3 $item->get_tax_class();
'account_id' => Options::get('bf_account_products'),
);
$data = apply_filters('bf_wc_lq_connector_order_item_data', $data, $item, $product);
if (isset($item['variation_id'])) {
$data['text'] = $this->get_item_attribute_meta($item);
}
if (Options::get('bf_display_product_excerpt')) {
$excerpt = get_the_excerpt($item['product_id']);
if ($excerpt) {
$data['text'] = isset($data['text']) ? $data['text'] . $excerpt : $excerpt;
}
}
array_push($order_items, $data);
}
return $order_items;
}
Вот изменения переменной.
Мод:
protected function get_order_items($order) {
$order_items = array();
$incl_tax = get_option('woocommerce_tax_display_cart') == 'incl';
foreach ($order->get_items() as $item) {
if ($incl_tax) {
$price = ($item['line_subtotal'] $item['line_subtotal_tax']) / $item['qty'];
} else {
$price = $item['line_subtotal'] / $item['qty']; // WC3 ($item->get_subtotal()/$item->get_quantity()),
}
$product = $this->get_product_from_item($item);
$posname = $item->get_meta("posname");
$pa_groesse = strtoupper($item->get_meta("pa_groesse"));
$pa_farbe = ucfirst($item->get_meta("pa_farbe"));
$nameneu = $posname . ' - ' . $pa_farbe .', ' . $pa_groesse;
$oriname = $item['name'];
if ( empty($posname) ) $nameneu = $oriname;
$artnr = strtoupper($item->get_meta("artnr"));
if ( empty($artnr) ) $artnr = $product ? $product->get_sku() : '';
$data = array(
'sku' => $artnr,
'name' => $nameneu, // WC3 $item->get_name(),
'quantity' => $item['qty'], // WC3 $item->get_quantity(),
'price' => $this->round_price($price),
'tax_id' => Options::get('bf_tax_' . ($item['tax_class'] ?: 'standard')), // WC3 $item->get_tax_class();
'account_id' => Options::get('bf_account_products'),
);
$data = apply_filters('bf_wc_lq_connector_order_item_data', $data, $item, $product);
if (array_key_exists('variation_id', $item)) {
$data['text'] = $this->get_item_attribute_meta($item);
}
if (Options::get('bf_display_product_excerpt')) {
$excerpt = get_the_excerpt($item['product_id']);
if ($excerpt) {
$data['text'] = isset($data['text']) ? $data['text'] . $excerpt : $excerpt;
}
}
array_push($order_items, $data);
}
return $order_items;
}
Ответ №1:
Возможно, вы можете обновить параметр amp;data в соответствии с приведенным ниже кодом:
add_filter('bf_wc_lq_connector_order_item_data', function( $data, $item, $product ) {
$posname = $item->get_meta('posname');
$pa_groesse = strtoupper($item->get_meta('pa_groesse'));
$pa_farbe = ucfirst($item->get_meta('pa_farbe'));
$nameneu = $posname . ' - ' . $pa_farbe . ', ' . $pa_groesse;
$oriname = $item['name'];
if ( empty($posname) ) {
$nameneu = $oriname;
}
$artnr = strtoupper($item->get_meta('artnr'));
if ( empty($artnr) ) {
$artnr = $product ? $product->get_sku() : '';
}
$data['sku'] = $artnr;
$data['name'] = $nameneu;
return $data;
}, 10, 2);
Комментарии:
1. спасибо за ваш ответ, но я уже пробовал это, и я получаю ошибку:(
2. Фактически, wordpress может изменять значения с помощью фильтров или добавлять дополнительную логику с помощью действий. Но если в исходном коде нет apply_filters или do_action, исходный код не может быть изменен.
Ответ №2:
Теперь с помощью прохожего я сделал первый шаг.
другой шаг-это
у меня в том же файле этот код
if (isset($item['variation_id'])) {
$datenalt = $this->get_item_attribute_meta($item);
$daten1 = preg_replace('/<li><strong class="wc-item-meta-label">Rücken Logo:</strong>.*?</li>/s', '', $datenalt); //Brustlogo
$daten2 = preg_replace('/<li><strong class="wc-item-meta-label">Brust Logo:</strong>.*?</li>/s', '', $daten1); //Brustlogo
$daten3 = preg_replace('/<li><strong class="wc-item-meta-label">Artikelnummer:</strong>.*?</li>/s', '', $daten2); //artnr
$daten4 = preg_replace('/<li><strong class="wc-item-meta-label">Name:</strong>.*?</li>/s', '', $daten3); //artnr
$datentext = preg_replace('/<li><strong class="wc-item-meta-label">Preis:</strong>.*?</li>/s', '', $daten4);//preis
$datenneu = '<i>Artikelnummer: '. $artnr . '</i></br>' . $datentext;
$data['text'] = $datenneu;
}
ори-это код:
if (isset($item['variation_id'])) {
$data['text'] = $this->get_item_attribute_meta($item);
}