Woocommerce shop orderby = RANDOM, как предотвратить повторение товаров при переходе на другую страницу с помощью нумерации страниц - PullRequest
0 голосов
/ 13 июня 2019

По сути, у меня есть рабочий код в функциях, который отображает продукты случайным образом для назначенной категории.Проблема в том, что при отображении продуктов, если они имеют нумерацию страниц, на странице 2/3 / ... появляются повторения продуктов. Я пытаюсь предотвратить это.

Я пытался внедрить мой рабочий кодот плагина, который делает именно это, но не для конкретной категории.

Так что я пытаюсь рандомизировать порядок продуктов для конкретной категории.Это код, который делает это (но с повторением на странице 2/3 /...)

function custom_catalog_ordering_args_8( $args ) {

$product_category = 'best-sellers';

if( ! is_product_category($product_category) ) return $args;

// Set default ordering to 'date ID', so "Newness"
$args['orderby'] = 'rand';

if( $args['orderby'] == 'date ID' )
    $args['order'] = 'DESC'; // Set order by DESC

return $args;
}    

add_filter( 'woocommerce_get_catalog_ordering_args', 'custom_catalog_ordering_args_8', 20, 1 );    

Теперь ниже приведен код из плагина, который предотвращает повторение продуктов, создавая переходный срок жизни одногоhour `

    //add "Random" setting to product sorting menu
    function do2_addRandomProductOrderSetting($sortby){
        $sortby['random_order'] = 'Random';
        return $sortby;
    }
    add_filter('woocommerce_default_catalog_orderby_options','do2_addRandomProductOrderSetting');
    add_filter('woocommerce_catalog_orderby','do2_addRandomProductOrderSetting');

    //randomize products when setting is used
    function do2_randomizeProductWhenSet($args){
        $orderbySetting = isset($_GET['orderby']) ? wc_clean($_GET['orderby']) : apply_filters('woocommerce_default_catalog_orderby', get_option('woocommerce_default_catalog_orderby'));
        if('random_order' == $orderbySetting){
            if(false===($seed = get_transient('do2_randSeed'))){
                $seed = rand();
                set_transient('do2_randSeed', $seed, 3600 );
            }
            $args['orderby'] = 'RAND('.$seed.')';
            $args['order'] = '';
            $args['meta_key'] = '';
        }
        return $args;
    }
    add_filter('woocommerce_get_catalog_ordering_args','do2_randomizeProductWhenSet');
}
} else {
if(!function_exists('do2_WooCommerceAdminNotice')){
    //warn on missing WooCommerce
    function do2_WooCommerceAdminNotice() {
    ?>
        <div class="notice error is-dismissible" >
            <p><?php _e('Your site must be running WooCommerce to benefit from the WooCommerce Random Product Sorting with Pagination plugin.'); ?></p>
        </div>
    <?php
    }
    add_action('admin_notices', 'do2_WooCommerceAdminNotice');
}    

И ниже приведена его реализация, которую я пытался сделать, чтобы она работала для определенной категории, в данном случае« бестселлеров », но она не работает вообще

 function do2_randomizeProductWhenSet($args){

$product_category = 'best-sellers';

if( ! is_product_category($product_category) ) return $args;
        $orderbySetting = isset($_GET['orderby']) ? wc_clean($_GET['orderby']) : 

apply_filters('woocommerce_default_catalog_orderby',    

get_option('woocommerce_default_catalog_orderby'));    

if( ! is_product_category($product_category) == $orderbySetting){
            if(false===($seed = get_transient('do2_randSeed'))){
                $seed = rand();
                set_transient('do2_randSeed', $seed, 3600 );
            }
            $args['orderby'] = 'RAND('.$seed.')';
            if( $args['orderby'] == 'date ID' )
    $args['order'] = 'DESC'; // Set order by DESC
        }
        return $args;
    }

    add_filter('woocommerce_get_catalog_ordering_args','do2_randomizeProductWhenSet');    

Кто-нибудь, пожалуйста ??Очень ценится!

1 Ответ

0 голосов
/ 14 июня 2019

Я надеюсь, что это полезно

session_start();
    $seed = $_SESSION['seed'];
    if (empty($seed)) {
      $seed = rand();
      $_SESSION['seed'] = $seed;
    }
    $sortby = 'RAND('.$seed.')';

    $atts = array(
        'orderby' => $sortby, 
        'per_page' => $per_page,//your limit products per page
        'page' => $paged, // your num page pagination
    );
    $shortcode = new WC_Shortcode_Products($atts, 'recent_products');
    echo $shortcode->get_content();
...