首页 文章

Ajax search pro高级选项 - 将自定义字段与术语相结合

提问于
浏览
2

我正在使用带有WooCommerce的Ajax search pro插件进行高级产品搜索 .

Ajax search pro插件设置中,有一个标签"Advanced options",您可以在其中自定义帖子 Headers 和帖子描述 .
例如,如果您搜索键入 Aven... ,则结果将显示 Avengers ...

在高级选项卡中,您可以自定义结果显示某些自定义字段,并获得类似: Avengers 10$'post_title''_price '组合 .

我的问题是我无法将自定义字段与自定义分类相结合 . 例如,将 'post_title' 自定义字段与 release_year 自定义分类法组合是不可能的,具有类似此组合的内容 Avengers 2012 .

我想在自定义字段之间使用一些特殊组合:

  • 自定义分类术语 release_yearin this answer .

  • 自定义分类类型(自定义类别类型) tvshow_cat (类似于 'product_cat' ) .
    我想从 tvshow_cat 分类中显示前3个相关产品术语(昏迷分离)的字符串 .

我怎么能做到这一点?

谢谢

1 回答

  • 3

    您可以构建一个函数,该函数将在产品元数据自定义字段中复制相关的格式化分类术语 . 这是评论的代码:

    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 );
        }
    }
    

    这是一个函数 to be used only once (之前进行数据库备份) . 此函数将创建 for all existing products 这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 );
    }
    

    下面的函数将创建该自定义字段 each time a new product is published

    // 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文件中...

    您可以克隆任意数量的自定义字段...

    This code is tested and works.

相关问题