web-dev-qa-db-ja.com

アーカイブではなく単一のページを表示するようにwordpressに指示する

そのため、URLに複数のカスタムパラメータがあり、クエリが3つのパラメータ(例:index.php?post_type=foo&<param-1>=<val-1>&<param-2>=<val-2>&<param-3>=<val-3>)に達した時点で、投稿は1つになる場合もあれば、なしになる場合もあります。この1つの投稿でアーカイブ(archive-foo.php)を表示する代わりに、私はwordpressに投稿自体を表示させたい(例:single-foo.php)。もちろん、私はarchive-foo.phpでこれらすべてをチェックし、そこから対応する投稿にリダイレクトすることができますが、この場合、アーカイブを表示するクエリ全体を「無駄に」します。

それで、(functions.phpのカスタム関数を使用し、それをadd_action('pre_get_posts', '<func-name>')を介してアタッチする)メインクエリを操作することによってarchiveが1つのレコードのみを含むときにwordpressが単一ページをロードする方法はありますか?

大まかな例:

add_action('pre_get_posts', 'custom_func')
function custom_func($query) {
    if($query->get('param-1')) {
        // Change some $query params, but still show archive
        if($query->get('param-2')) {
            // Change some $query params, but still show archive
            if($query->get('param-3')) {
                // There is 1 post or none for sure
                // Alter the query to something like
                $wpdb->query('SELECT * FROM wp_posts WHERE param1=val1 AND param2=val2 ...');
                // force to load a single page with the results passed to $post object
            }
        }
    }
}
1
somebody

これがラフフィルタです。

add_filter(
  'template_include',
  function($template) {
    global $wp_query;
    if (1 == $wp_query->found_posts) {
      global $wp_query;
      $type = $wp_query->get('post_type') ?: false;
      $template_type = $type ? 'single-' . $type. '.php' : 'single.php';
      if ( locate_template($template_type) ) {
        return locate_template($template_type);
      } elseif ( $type && locate_template('single.php') ) {
        return locate_template('single.php');
      }
    }
    return $template;
  }
);

カスタムのsingle-{*}.phpテンプレートを適切に扱うように変更する必要があります。 (G.M.による編集)

私は少し後でコードを編集するかもしれませんが、私はあなたが始められるようになると思いました。

2
s_ha_dum

template_include()関数を使用して何ができると思います:

 add_filter('template_include','alter_template');
 function alter_template($template){

     global $wp_query;

     if($wp_query->found_posts == 1) {
         $template = get_stylesheet_directory().'/single.php';
     }

     return $template;
  }

または、template_direct()を使用して投稿にリダイレクトする場合:

add_action( 'template_redirect', 'my_page_template_redirect' );
function my_page_template_redirect()
{
    global $wp_query;
    if($wp_query->found_posts == 1)
    {
        wp_redirect( 'URL_of_the_post );
        exit();
    }
}
1
cybmeta