私のものと非常によく似た質問があります、それはここで見つけることができます。私の質問との違いは、私の検索フォームはいくつかのページ(page.php
とsingle.php
)にあり、私はwp-pagenaviを使っていないことです。提案されている解決策をそこに掲載してみましたが、うまくいきませんでした。
うまくいっていること
機能していない:フォームを送信してページ1以外のページをクリックすると、URLはexample.com/overview/?paged=2またはexample.com/cityになります。/boston /?paged = 2ですが、結果は表示されません。
受け入れられた答えの後に更新された:問題がどのように解決されたかを見るためにコードの中のメモを読んでください。
---これが私のコードの設定です
Onpage.php
if(is_page('overview')) {
get_template_part('templates/overview', 'main');
}
Onsingle.php(同じファイルを含める)
if(is_singular('cities')) {
get_template_part('templates/overview', 'main');
}
概要overview-main.php
include_once 'overview-search-input.php';
include_once 'overview-sidebar.php';
overview-search-input.php(UPDATE 3以降で変更、以下の元のコード)
if(!empty($_GET['period'])) {
$period = $_GET['period'];
}
else {
$period = 'upcoming'; // Set to upcoming if nothing is selected
}
$query = search_v1($period, $paged); // Passing the $paged parameter in the query
$paged = (get_query_var('paged')) ? get_query_var('paged') : 1; // The $paged parameter
概要overview-sidebar.php
<form action="<?php echo get_permalink(); ?>" method="get">
<select name="period" placeholder="Select">
<option value=""></option>
<option value="all"></option>
<option value="upcoming"></option>
</select>
</form>
関数内search_v1:
$args = array(
'post_type' => 'events',
'post_status' => 'publish',
'posts_per_page' => 20,
'paged' => $paged, // This was passed into the function
'meta_query' => array($meta_query), // This is generated based on the $period input and it's working (tested)
'meta_key' => 'date_from',
'orderby' => 'meta_value',
'order' => 'ASC',
);
return new WP_Query($args);
それからoverview-main.php
if($query->have_posts()): while ($query->have_posts()): $query->the_post();
// Do stuff
endwhile;
create_pagination($query);
wp_reset_postdata();
endif;
そして関数create_paginationの中で:
$query->query_vars['paged'] > 1 ? $current = $query->query_vars['paged'] : $current = 1;
$args = array(
'base' => @add_query_arg('paged','%#%'),
'format' => '?paged=%#%',
'total' => $query->max_num_pages,
'current' => $current,
'show_all' => false,
'end_size' => 1,
'mid_size' => 2,
'prev_next' => true,
'prev_text' => '<i class="icon-chevron-left"></i>',
'next_text' => '<i class="icon-chevron-right"></i>',
'type' => 'list'
);
return paginate_links($args);
問題は次のとおりです。両方のページ付け関数が機能し、正しいページ付けリンクが表示されるので、それは問題ではないと思います。私はそれがカスタムクエリにあると思います(結果が一度生成されてフォーム入力によって変更されないときこの改ページはsearch.phpで動作するので)。
問題は解決しました: 'paged'パラメータを使用してクエリに渡すことで
あなたのコードで変更すべきことがいくつかあります。
$_SESSION
を使わないでください。そのため、どこにもsession_startを追加しないでください。あなたのフォームでmethod="get"
を使って、クエリ文字列を通して現在の状態を渡すことができます。search_v1
関数に渡すことができます、このようにあなたは間違いではないでしょうfilter_input
を使用することをお勧めします。overview-search-input.php
ファイルでは、最後の行は$query = search_v1($_SESSION['period']);
です。これはまったく役に立ちません。この変更を適用する:
page.php
とsingle.php
は変更されません。session_start();
を削除します。それから
overview-search-input.php
<?php
$period = filter_input(INPUT_GET, 'period', FILTER_SANITIZE_STRING);
$paged = get_query_var('paged');
if ( empty($period ) ) $period = 'upcoming';
if ( empty($paged) ) $paged = 1;
overview-sidebar.php
<form action="<?php echo get_permalink(); ?>" method="get">
<select name="period" placeholder="Select">
<option <?php selected('', $period) ?>></option>
<option <?php selected('all', $period) ?>>all</option>
<option <?php selected('upcoming', $period) ?>>upcoming</option>
</select>
</form>
overview-main.php
include_once 'overview-search-input.php';
include_once 'overview-sidebar.php';
$query = search_v1( $period, $paged );
if( $query->have_posts() ) : while ( $query->have_posts() ) : $query->the_post();
// Do stuff
endwhile;
echo create_pagination( $query, $period );
wp_reset_postdata();
endif;
最後に、2つの関数search_v1
とcreate_pagination
:
function search_v1( $period = 'upcoming', $paged = 1 ) {
if ( empty($paged) ) $paged = 1;
$meta_query = array(
// create your meta query here
);
$args = array(
'post_type' => 'events',
'post_status' => 'publish',
'posts_per_page' => 20,
'paged' => $paged,
'meta_query' => array($meta_query),
'meta_key' => 'date_from',
'orderby' => 'meta_value',
'order' => 'ASC',
);
return new WP_Query( $args );
}
function create_pagination( $query, $period = 'upcoming' ) {
$current = isset($query->query_vars['paged']) ? $query->query_vars['paged'] : 1;
$args = array(
'base' => get_permalink() . '%_%',
'format' => '?paged=%#%&period=' . $period,
'total' => $query->max_num_pages,
'current' => ($current > 0) ? $current : 1,
'show_all' => false,
'end_size' => 1,
'mid_size' => 2,
'prev_next' => true,
'prev_text' => '<i class="icon-chevron-left"></i>',
'next_text' => '<i class="icon-chevron-right"></i>',
'type' => 'list'
);
return paginate_links($args);
}
この行の代わりに
$paged = (get_query_var('paged')) ? get_query_var('paged') : 1;
これを使って確認できますか。
$paged = (get_query_var('page')) ? get_query_var('page') : 1;
これも
$query->query_vars['paged'] > 1 ? $current = $query->query_vars['paged'] : $current = 1;
に
$query->query_vars['page'] > 1 ? $current = $query->query_vars['page'] : $current = 1;
注:カスタムページテンプレートを使用しているので、 "paged"は機能しません。