Расширенная опция Ajax search pro - Объединение пользовательских полей с терминами
Я использую Ajax поиск pro плагин с WooCommerce для расширенного поиска товаров.
В Ajax поиск pro в настройках плагина есть вкладка "Дополнительные параметры", где вы можете настроить заголовок и описание поста.
Например, если вы выполняете поиск, вводя Aven...
тогда результат будет показан Avengers
...
На вкладке дополнительно вы можете настроить отображение результата с помощью некоторого настраиваемого поля и получить что-то вроде: Avengers 10$
объединение 'post_title'
с '_price
'.
Моя проблема в том, что я не могу объединить эти пользовательские поля с пользовательской таксономией. Например, объединение 'post_title' настраиваемого поля с release_year
пользовательская таксономия невозможна, чтобы иметь что-то вроде этой комбинации Мстители 2012.
Я хотел бы использовать некоторые специальные комбинации между пользовательскими полями и:
Пользовательские термины таксономии
release_year
как будто в этом ответе.Пользовательский тип таксономии (пользовательский тип категории)
tvshow_cat
( подобно тому, как'product_cat'
является).
Я хотел бы отобразить строку из первых 3 терминов, связанных с продуктом (разделенных комой), изtvshow_cat
таксономия.
Как я могу этого добиться?
Спасибо
1 answers
Вы можете создать функцию, которая будет копировать соответствующие отформатированные термины таксономии в настраиваемые поля метаданных продукта. Вот прокомментированный код:
1) Подфункции (используемые 2 основными функциями):
// Processing 'release_year' formatting in a string
function process_release_year( $post_id ){
$release_years_str = get_the_term_list( $post_id, 'release-year', '', ',' );
$release_years_arr = explode(',', $release_years_str);
$count = sizeof( $release_years_arr );
$first_year = $release_years_arr[ 0 ];
if ( $count > 1 ) {
$last_year = $release_years_arr[ $count - 1 ];
$releaseyear_as_text = ' (' . $first_year . ' - ' . $last_year . ')';
}
elseif ($count == 1) $releaseyear_as_text = ' ' . $first_year;
else $releaseyear_as_text = '';
return $releaseyear_as_text;
}
// Processing 'tvshow_cat' formatting in a string (3 coma separated terms in a string)
function process_tvshow_cat( $post_id ){
$description_terms = get_the_terms( $post_id, 'tvshow_cat' );
$count = 0; $description_string = '';
foreach ( $description_terms as $description_term ) {
$count++;
if( $count < 4 ){
$description_string .= $description_term;
if( $count < 3 ) $description_string .= ', ';
}
}
return $description_string;
}
// The two custom fields creation mechanism
function custom_fields_creation( $post_id ){
// The release year
$test_cf1 = get_post_meta($post_id, 'release_year', true );
if( empty($test_cf1) ) {
// if doesn't exist we create it
$release_year = process_release_year($post_id);
if( !empty( $release_year ) )
update_post_meta($post_id, 'release_year', $release_year );
}
// The TV show cat
$test_cf2 = get_post_meta($post_id, 'mov_description', true );
if( empty($test_cf2) ) {
// if doesn't exist we create it
$description_mov = process_release_year($post_id);
if( !empty($description_mov) )
update_post_meta($post_id, 'mov_description', $description_mov );
}
}
Вот функция , которая будет использоваться только один раз (сделайте резервную копию базы данных раньше). Эта функция создаст для всех существующих продуктов 2 специальных настраиваемых поля.
// 1. FOR ALL EXISTING PRODUCTS ==> ==> ==> USE IT ONE TIME ONLY!
add_action( 'woocommerce_init', 'product_custom_fields_bulk_action' ); // To stop it, just comment this line
function product_custom_fields_bulk_action(){
// Get all published products
$products = get_posts( array(
'post_type' => 'product',
'post_status' => 'publish',
'numberposts' => -1
) );
// Iterating each product
foreach( $products as $product )
custom_fields_creation( $product->id );
}
Функция, приведенная ниже, создаст это настраиваемое поле каждый раз, когда публикуется новый продукт:
// 2. FOR "NEW CREATED" AND PUBLISHED PRODUCT
add_action('transition_post_status', 'product_custom_fields_action', 10, 3);
function product_custom_fields_action($new_status, $old_status, $post) {
$post_id = $post->ID;
if( $old_status != 'publish' && $new_status == 'publish' && !empty($post_id) && in_array( $post->post_type, array( 'product') ) )
custom_fields_creation( $post->ID );
}
Этот код продолжается function.php файл в вашей активной дочерней теме или теме...
Вы можете клонировать столько пользовательских полей, сколько захотите...
Этот код протестирован и работает.