Rezolvă un conflict între numele unui tip de postare personalizat și link-ul permanent al paginii (același slug)
Am un tip de postare personalizat numit "visningshus" și, de asemenea, o Pagină cu același slug. Așa trebuie (este necesar) să fie.
În prezent, "http://my-site.com/visningshus" listează toate postările de acest tip. Vreau să afișez pagina care are acel slug în link-ul permanent în schimb.
Cum pot face ca WordPress să nu dea prioritate numelui tipului de postare, ci în schimb link-ului permanent, și să afișeze Pagina?

Cea mai ușoară metodă ar fi să dezactivezi pagina de arhivă pentru acest CPT (Custom Post Type):
register_post_type( 'visningshus',
array(
[...]
'has_archive' => false,
[...]
)
);
Nu uita să actualizezi permalink-urile după aceea în "Setări > Legături permanente"

A funcționat perfect - dar acum toate legăturile permanente care încep cu numele tipului de postare personalizată returnează eroarea 404, deși în wp-admin acestea sunt corecte și nu pare să se facă nicio rescriere. Cu alte cuvinte, toate legăturile permanente sunt corecte pe site, dar toate postările personalizate returnează eroarea 404. Poți să mă ajuți cu asta? :)

@HenrikErlandsson Poate că tipul tău de postare are același nume ca o pagină. În acest caz, îți recomand să schimbi numele tipului de postare. Exemplu: Numele tipului de postare personalizată - Înainte: products După: cpt_products.

Nu am reputație suficient de mare pentru a comenta postul lui @Carl, dar răspunsul său este cel corect (cel puțin în această situație de a păstra slug-ul paginii și slug-ul tipului de postare personalizat la fel și de a nu folosi un fișier archive.php)
Dar răspunsul său ar genera erori cu paginarea. Pentru a evita erorile de paginare:
add_rewrite_rule('^visningshus/page/([0-9]+)','index.php?pagename=visningshus&paged=$matches[1]', 'top');
Aceasta verifică paginarea, preia numărul paginii, iar apoi forțează utilizarea paginii cu slug-ul corespunzător și inserează variabila paginii.
Aceasta în plus față de 'has_archive' => false,
postat mai sus ar trebui să obțină funcționalitatea dorită.
După cum au menționat și alții, asigurați-vă că resetați regulile de rescriere vizitând Setări > Legături permanente după ce faceți această modificare.
Sper că acest lucru va ajuta pe cineva, pentru că știu că m-a dat peste cap pentru mult timp.

Salut Henrik!
Cred că tot ce trebuie să faci este să adaugi o regulă de rescriere la regulile de rescriere WordPress care au fost deja create. Adaugă acest fragment de cod în functions.php al temei tale sau include-l ca un plugin separat...
add_action('init', function () {
add_rewrite_rule('visningshus/?$','index.php?pagename=visningshus', 'top');
flush_rewrite_rules();
}, 1000);

Dacă cineva folosește acest lucru, eliminați flush_rewrite_rules();
Nu ar trebui să modificați regulile de rescriere la fiecare apel al init
. Reîncărcați o dată, apoi eliminați-l, sau resetați manual permalinkurile mergând la setările de permalinkuri în panoul de administrare și făcând click pe "Salvează modificările".

Dintre toate răspunsurile de aici, acesta a funcționat pentru mine!!! Mulțumesc mult.

RE: flush_rewrite_rules()
- nu este deloc o idee bună să folosiți această funcție într-un hook init
- sau în orice alt hook care rulează frecvent. Acest lucru va face ca instalarea WordPress să reseteze regulile de rescriere din baza de date și să le reinsereze pentru fiecare încărcare de pagină, ceea ce reprezintă o suprasolicitare inutilă, motiv pentru care WordPress nu face acest lucru singur. După crearea regulii de rescriere, mergeți la Setări > Permalinkuri și faceți click pe salvare - acest lucru va reseta manual regulile de rescriere o singură dată, ceea ce este suficient.

Dacă ai înregistrat tu tipul de postare, poți modifica statusul arhivei și URL-ul în tema sau pluginul tău.
'has_archive' => true,
activează arhiva în post-type-permalink. Deci schimbă asta în
'has_archive' => false,
va dezactiva arhiva.
'has_archive' => 'custom-slug',
va activa arhiva cu un slug personalizat(http://my-site.com/custom-slug/).
Dacă un plugin sau tema ta o înregistrează, o poți dezactiva folosind metoda sugerată de krafter. De asemenea, poți folosi un slug personalizat pentru arhivă.
register_post_type( 'visningshus',
array(
[...]
'has_archive' => 'custom-slug',
[...]
)
);
Dacă ai nevoie atât de pagină cât și de arhivă, cea mai bună metodă ar fi să plasezi arhiva într-un slug personalizat diferit.

Am rezolvat fără a soluționa conflictul. Creează o pagină cu slug-ul visningshus și scrie orice dorești în ea. Notează ID-ul acestei pagini.
Creează și personalizează șablonul archive-custom-post-type.php în orice mod dorești (cel mai probabil vei folosi doar un șablon de pagină), dar înlocuiește partea de loop cu:
$recent = new WP_Query("page_id=id-ul-paginii-tale");
while($recent->have_posts()) : $recent->the_post();
the_content();
endwhile;
Apoi, când vei accesa http://my-site.com/visningshus, vei vedea conținutul gestionat de pagină la URL-ul corect.
Spune-mi dacă funcționează.

Ideea bună, dar asta este excesiv de complicat. Ai încercat soluția mea?

Această soluție are și unele efecte secundare, cum ar fi faptul că header-ul și tot restul sunt în continuare create ca și cum ar fi o pagină de arhivă și nu o pagină obișnuită. Nu aș recomanda utilizarea acestei soluții.

Iată o soluție generală pentru a priorita paginarea în locul conținutului tipurilor personalizate de postări (custom post types) pentru ORICE slug de tip personalizat.
// prioritizează paginarea în locul afișării conținutului tipurilor personalizate de postări
add_action('init', function() {
add_rewrite_rule(
'(.?.+?)/page/?([0-9]{1,})/?$',
'index.php?pagename=$matches[1]&paged=$matches[2]',
'top'
);
});
Pe lângă adăugarea acestui fragment de cod, ar trebui să vă asigurați că tipul vostru personalizat de postări are setat archive = false
Și nu în ultimul rând, mergeți la pagina de setări Permalinks Setări > Legături permanente (/wp/wp-admin/options-permalink.php) și salvați setările curente pentru a reîmprospăta structura legăturilor pe pagină.
