そのため、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
}
}
}
}
これがラフフィルタです。
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;
}
);
カスタムの (G.M.による編集)single-{*}.php
テンプレートを適切に扱うように変更する必要があります。
私は少し後でコードを編集するかもしれませんが、私はあなたが始められるようになると思いました。
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();
}
}