WooCommerce 商店循环随机数组函数彼此不相同的值

WooCommerce shop loop random array function not same values after each other

我正在使用这个数组函数在 WooCommerce 商店循环中输出随机输入值。我现在试着让它像这样,相同的输入不会 select 彼此相继。

示例: 我在数组中有 4 个不同的输入值。现在,如果 [0] 是随机 selected,那么对于第二个 catch,它不可能再次 select [0]。只有 [1]、[2] 和 [4] 是可能的。如果 [2] 被 selected 用于第二个输入,那么对于第三个 select 只有值 [0]、[1] 和 [3] 应该被 selected。

总的来说:不是select 相同的数组值依次输入。但是应该有可能一些输入被 select 编辑了不止一次……但不是一个接一个……

有什么可能吗?

// Adding custom content block to shop loop row

add_action( 'woocommerce_shop_loop', 'add_custom_content_to_shop_loop_row' );
function add_custom_content_to_shop_loop_row() {

    // Variables
    global $wp_query;
    
    // Custom array input options
    $input = array("<img src='/wp-content/uploads/2022/01/banner-001.svg'>", "<img src='/wp-content/uploads/2022/01/banner-002.svg'>", "<img src='/wp-content/uploads/2022/01/banner-003.svg'>" );

    // Column count
    $columns = esc_attr( wc_get_loop_prop( 'columns' ) );
    
    // Add content every X product
    if ( (  $wp_query->current_post % 7 ) ==  0 && $wp_query->current_post !=  0 ) {
        
    // output random array custom content
        $rand_keys = array_rand($input, 1);

        echo $input[$rand_keys] . "\n";
    }

}

我尝试使用这里的方法 https://ofstack.com/PHP/37611/summary-of-5-methods-of-generating-non-repeating-random-numbers-in-php.html 但它根本不起作用。

您将不得不以某种方式记住先前选择的值,然后在下次调用该函数时忽略该键。

// Get the latest key - I've saved this as a transient, but you can use another method.
$previous = get_transient( 'previous_content_index' );
if ( $previous !== false ) { // Check explicitly for false, as the previous key may be "0".
    // Array diff will temporarily remove the previous index.
    $input = array_diff_key( $input, array( $previous => '' ) );
}
$rand_keys = array_rand($input, 1);
// Remember this key for next time.
set_transient( 'previous_content_index', $rand_keys, DAY_IN_SECONDS );

有几种方法,您可以通过 cookie、会话、瞬态、元数据临时存储值。但我个人会选择全局变量,这样就不需要数据库请求了。

所以你得到:

function random_result() {
    // Input
    $input = array( '<img src="/wp-content/uploads/2022/01/banner-001.svg">', '<img src="/wp-content/uploads/2022/01/banner-002.svg">', '<img src="/wp-content/uploads/2022/01/banner-003.svg">' );

    // NOT isset (result) OR NOT isset (counter)
    if ( ! isset( $GLOBALS['result'] ) || ! isset( $GLOBALS['counter'] ) ) {
        // Shuffle an array
        shuffle( $input );

        // Globals
        $GLOBALS['result'] = $input;
        $GLOBALS['counter'] = 0;
    } else {
        // Plus 1
        $GLOBALS['counter'] += 1;
    }

    // Store
    $counter = $GLOBALS['counter'];

    // Limit is reached, reset
    if ( $counter == ( count( $input ) - 1 ) ) {
        unset( $GLOBALS['counter'] );
    }

    return $GLOBALS['result'][$counter];
}

function action_woocommerce_shop_loop() {
    // Variables
    global $wp_query;
    
    // Add content every X product
    if ( (  $wp_query->current_post % 7 ) ==  0 && $wp_query->current_post !=  0 ) {
        // Call function, display result
        echo random_result();
    }
}
add_action( 'woocommerce_shop_loop', 'action_woocommerce_shop_loop' );