Cum să folosești arhiva unui tip de postare personalizat ca pagină principală?
Aș dori să folosesc arhiva unui tip de postare personalizat ca pagină principală a site-ului, astfel încât
http://the_site.com/
să fie o arhivă de tip de postare personalizat afișată conform fișierului meu archive-{post-type}.php
.
Ideal, aș dori să modific query-ul folosind is_front_page()
în fișierul meu functions.php
. Am încercat următoarea variantă, cu o pagină numită "Home" setată ca pagină principală:
add_filter('pre_get_posts', 'my_get_posts');
function my_get_posts($query){
global $wp_the_query;
if(is_front_page() && $wp_the_query === $query){
$query->set('post_type','album');
$query->set('posts_per_page',-1);
}
return $query;
}
dar pagina principală returnează conținutul paginii "Home" și pare să ignore query-ul personalizat.
Ce fac greșit? Există o modalitate mai bună, în general, de a realiza acest lucru?
După ce ai setat o pagină statică ca pagină de start, poți adăuga acest cod în functions.php
și ești gata de pornire. Acest lucru va apela și șablonul archive-POSTTYPE.php
corect.
add_action("pre_get_posts", "custom_front_page");
function custom_front_page($wp_query){
//Asigură-te că acest filtru nu se aplică în zona de administrare
if(is_admin()) {
return;
}
if($wp_query->get('page_id') == get_option('page_on_front')):
$wp_query->set('post_type', 'NUMELE TIPULUI DE POSTARE AICI');
$wp_query->set('page_id', ''); //Gol
//Setează proprietățile care descriu pagina pentru a reflecta faptul că
//nu afișăm de fapt o pagină statică
$wp_query->is_page = 0;
$wp_query->is_singular = 0;
$wp_query->is_post_type_archive = 1;
$wp_query->is_archive = 1;
endif;
}

Această funcție are nevoie de if(is_admin()) return;
chiar la început, altfel interferează cu zona de administrare.

Deși a funcționat pentru mine, meniurile mele principale și secundare au dispărut ca urmare.

Este aproape corect. Acest cod modifică toate wp_queries, deci ar trebui să fie if ( is_home() ) în loc de if ($wp_query->get.....)

Folosesc același lucru, dar în șablonul meu personalizat de pagină în loc de pagina principală, și nu afișează niciun rezultat (ca și cum nu ar fi adăugate postări personalizate). Aveți idei?

Această soluție nu suportă paginare. Orice URL /page/2 afișează în continuare primele 10 postări.

Redenumește arhiva CPT-ului tău în home.php
Apoi folosește pre_get_posts pentru a modifica interogarea paginii de acasă astfel încât să afișeze doar CPT-uri
function wpsites_home_page_cpt_filter($query) {
if ( !is_admin() && $query->is_main_query() && is_home() ) {
$query->set('post_type', array( 'your-cpt' ) );
}
}
add_action('pre_get_posts','wpsites_home_page_cpt_filter');
Înlocuiește your-cpt cu numele tipului tău de postare personalizată.

Mulțumesc pentru răspuns, ljaas—chiar căutam să rezolv această problemă exactă. Pentru a asigura că șablonul de arhivă pentru tipul personalizat de postare este apelat, a trebuit să adaug următoarele condiții:
$wp_query->is_post_type_archive = 1;
$wp_query->is_archive = 1;

Salut Eli, bine ai venit pe WPSE. „Răspunsurile” sunt menite să răspundă la întrebarea inițială (site-urile stackexchange nu sunt forumuri de discuții ierarhizate). Acest lucru ar fi mult mai potrivit pentru un comentariu.

Pentru mine funcționează mai bine prin suprascrierea atât a articolelor de blog cât și a paginii statice în Setări > Citire > Afișare pagină principală:
<?php
/**
* Setează arhiva de tip post personalizat ca pagină principală.
*
* @since 1.0.0
*/
function ql_set_as_front_page( $query ) {
if ( is_admin() || ! $query->is_main_query() ) {
return;
}
if ( ql_is_front_page( $query ) ) {
$query->set( 'page_id', '' );
$query->is_page = false;
$query->is_singular = false;
$query->set( 'post_type', 'MYCPT' );
$query->is_archive = true;
$query->is_post_type_archive = true;
}
}
add_action( 'pre_get_posts', 'ql_set_as_front_page' );
/**
* Preluat din WP_Query::is_front_page și adaptat pentru a compara page_on_front cu ID-ul paginii curente.
*
* @since 1.0.0
*
* @param object $query Interogarea principală WP.
*/
function ql_is_front_page( $query ) {
if ( 'posts' == get_option( 'show_on_front') && $query->is_home() )
return true;
elseif ( 'page' == get_option( 'show_on_front') && get_option( 'page_on_front' ) && $query->get('page_id') == get_option( 'page_on_front' ) )
return true;
else
return false;
}
Folosesc acest cod împreună cu o suprascriere a șablonului utilizând filtrele front_page_template
și home_template
pentru a returna un șablon personalizat.

Pentru mine, acest lucru strică paginarea: fie că selectezi pagina de index sau o pagină statică ca pagină principală, linkurile de paginare apar, dar când dai clic pe pagina 2, primesc:
- în cazul paginii de index (implicită): pagina 404
- în cazul paginii statice: aceleași rezultate ca pe pagina 1: argumentul "paged" este interpretat pentru a afișa paginarea tipului de pagină, nu paginarea listei de postări.
Cred că sunt necesare câteva reguli de rescriere pentru a captura argumentul "paged" și a-l transmite corect.
Oricum, o pagină de șablon personalizată ar trebui să fie soluția, împreună cu câteva reguli suplimentare de rescriere.
