web-dev-qa-db-ja.com

カスタムクエリフォーム送信ページ付け

私のものと非常によく似た質問があります、それはここで見つけることができます。私の質問との違いは、私の検索フォームはいくつかのページ(page.phpsingle.php)にあり、私はwp-pagenaviを使っていないことです。提案されている解決策をそこに掲載してみましたが、うまくいきませんでした。

うまくいっていること

  • クエリは正しい結果を表示します
  • フォーム送信後、クエリに正しい結果が表示されます。
  • ページネーションは正しいリンクで表示されます(例:example.com/overview/?paged=2およびexample.com/city/boston/?paged=2)。
  • 同じ設定のページ区切りがsearch.phpで機能します

機能していない:フォームを送信してページ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'パラメータを使用してクエリに渡すことで

2
eskimo

あなたのコードで変更すべきことがいくつかあります。

  1. $_SESSIONを使わないでください。そのため、どこにもsession_startを追加しないでください。あなたのフォームでmethod="get"を使って、クエリ文字列を通して現在の状態を渡すことができます。
  2. より良い流れのために、あなたは引数として現在のページをsearch_v1関数に渡すことができます、このようにあなたは間違いではないでしょう
  3. スーパーグローバル 配列にアクセスする必要がある場合は、直接アクセスする代わりに filter_input を使用することをお勧めします。
  4. overview-search-input.phpファイルでは、最後の行は$query = search_v1($_SESSION['period']);です。これはまったく役に立ちません。
  5. 現在表示されている投稿の期間オプションを選択する形式では便利だと思います。あなたが期間「今後」の投稿を表示しているときは、フォームでオプション「今後」を選択する必要があります。

この変更を適用する:

  • page.phpsingle.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_v1create_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);
}
2
gmazzap

この行の代わりに

$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"は機能しません。

0
Subharanjan