Rezolvă un conflict între numele unui tip de postare personalizat și link-ul permanent al paginii (același slug)

19 feb. 2014, 10:32:09
Vizualizări: 46.7K
Voturi: 32

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?

0
Toate răspunsurile la întrebare 8
3
52

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"

19 feb. 2014 12:28:14
Comentarii

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? :)

Henrik Erlandsson Henrik Erlandsson
11 mar. 2014 17:44:05

@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.

Bruno Monteiro Bruno Monteiro
6 apr. 2016 20:08:19

Foarte inteligent. Rezolvă o grămadă de probleme

bysanchy bysanchy
9 apr. 2017 18:08:32
0
12

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.

14 mar. 2017 22:22:43
3

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);
13 mai 2016 17:19:54
Comentarii

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".

tehlivi tehlivi
14 iun. 2017 21:10:47

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

Pooja Mistry Pooja Mistry
11 iun. 2020 19:12:17

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.

bosco bosco
12 iun. 2021 05:36:09
0

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.

9 feb. 2020 14:47:48
4

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ă.

19 feb. 2014 12:31:15
Comentarii

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

kraftner kraftner
19 feb. 2014 12:32:51

@kraftner nu, nu am încercat. O să o testez data viitoare. Mulțumesc!

molokom molokom
19 feb. 2014 12:55:20

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.

kraftner kraftner
19 feb. 2014 13:00:30

Ce se întâmplă dacă ID-ul paginii se schimbă? Aceasta nu este o metodă sigură.

Joel James Joel James
6 feb. 2017 09:19:05
0

Nu este permis să votezi, dar + pentru soluția lui Carl, register_post_type ar trebui să aibă

'has_archive' => false

Simplu. Cu toate acestea, când întâmpini probleme de paginare, aruncă o privire la

add_rewrite_rule
23 feb. 2017 19:31:02
0

Ce a funcționat pentru mine a fost setarea opțiunii archive la false, dar și setarea Hierarchical la false atunci când am configurat tipul meu personalizat de postare!

5 oct. 2018 15:50:24
0

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ă.

8 oct. 2018 09:33:12