带有自定义 posts_per_page 问题的 Wordpress 分页

Wordpress pagination with custom posts_per_page issue

在自定义 Woocommerce 产品页面中,我使用下拉菜单过滤 posts_per_page。它运行良好,table 已更新为新值。 但是如果我点击 'Next' 按钮,next_posts_link 不会 post 新的 posts_per_page 值,第二页默认从记录 #11 开始。 有什么解决办法吗?

<?php                   
       $prodNum = $_POST['num_prods'];
?>

<!-- SELECT POST PER PAGES  -->
<form id="numProdsForm" method="POST">
    <select name="num_prods" id="num_prods" onchange="this.form.submit()">
      <option value="10" <?php if ($prodNum==10){ ?> selected <?php }  ?>>10</option>
      <option value="20" <?php if ($prodNum==20){ ?> selected <?php }  ?>>20</option>
      <option value="30" <?php if ($prodNum==30){ ?> selected <?php }  ?>>30</option>
      <option value="50" <?php if ($prodNum==40){ ?> selected <?php }  ?>>50</option>
      <option value="100" <?php if ($prodNum==50){ ?> selected <?php }  ?>>100</option>
    </select>
</form>


<!-- CUSTOM TABLE  -->

<table>
<?php if ( woocommerce_product_loop() ) { ?>

    
    <?php 
        $args = array(
            'post_type'      => 'product',
            'posts_per_page' => $prodNum,
            'orderby'=>'title',
            'order' => 'ASC'
        );

        $loop = new WP_Query( $args );
        while ( $loop->have_posts() ) : $loop->the_post();
            global $product;
    ?>

            <tr>
                <td class="flex-row" role="cell"><?php echo $product->get_attribute( 'color' ); ?></td>
            </tr>

    <?php endwhile; ?>
    <?php wp_reset_query(); ?>
    <?php
    } else {
        do_action( 'woocommerce_no_products_found' );
    }
    ?>

</table>

<div class="products-pagination">
<?php previous_posts_link( '&laquo; PREV', $loop->max_num_pages) ?>
<?php next_posts_link( 'NEXT &raquo;', $loop->max_num_pages) ?>
</div>

我试过将分页放在 wp_reset_query(); 之前,或者使用 get $paged = get_query_var( 'paged' ) ? get_query_var( 'paged' ) : 1;但没有任何变化。

您可以尝试对表单使用“GET”而不是“POST”,并传递偏移量和帖子数以显示为 URL 参数。然后您可以将 offset 属性添加到查询中。您还可以通过使用 selected selected function definition 而不是选项的 if 语句来优化某些代码。

<?php
$product_number  = ( isset( $_GET['num_prods'] ) ) ? absint( $_GET['num_prods'] ) : 0;
$existing_offset = ( isset( $_GET['offset'] ) ) ? absint( $_GET['offset'] ) : 0;
$offset          = $product_number + $existing_offset;
?>
    <!-- SELECT POST PER PAGES  -->
    <form id="numProdsForm" method="GET">
        <input type="hidden" name="offset" value="<?php echo esc_attr( $offset ); ?>">
        <select name="num_prods" id="num_prods" onchange="this.form.submit()">
            <option value=""> - - Choose Number of Products to Show -- </option>
            <option value="10" <?php selected( 10, $product_number ); ?>>10</option>
            <option value="20" <?php selected( 20, $product_number ); ?>>20</option>
            <option value="30" <?php selected( 30, $product_number ); ?>>30</option>
            <option value="50" <?php selected( 50, $product_number ); ?>>50</option>
            <option value="100" <?php selected( 100, $product_number ); ?>>100</option>
        </select>
    </form>

    <!-- CUSTOM TABLE  -->
    <table>
        <?php if ( woocommerce_product_loop() ) { ?>
            <?php
            $args = array(
                'post_type'      => 'product',
                'posts_per_page' => $product_number,
                'offset'         => $offset, // the offset.
                'orderby'        => 'title',
                'order'          => 'ASC',
            );

            $loop = new WP_Query( $args );
            while ( $loop->have_posts() ) :
                $loop->the_post();
                global $product;
                ?>
                <tr>
                    <td class="flex-row" role="cell"><?php echo $product->get_attribute( 'color' ); ?></td>
                </tr>
            <?php endwhile; ?>
            <?php wp_reset_postdata(); // use wp_reset_postdata(). ?>
            <?php
        } else {
            do_action( 'woocommerce_no_products_found' );
        }
        ?>
    </table>
    <div class="products-pagination">
        <?php previous_posts_link( '&laquo; PREV', $loop->max_num_pages ); ?>
        <?php next_posts_link( 'NEXT &raquo;', $loop->max_num_pages ); ?>
    </div>