it-swarm.com.de

Beheben eines Konflikts zwischen benutzerdefiniertem Post-Typnamen und Seiten-Permalink (gleicher Slug)

Ich habe einen benutzerdefinierten Post-Typ namens "visningshus" und auch eine Seite mit diesem Slug. Das ist so, wie es sein sollte (muss).

Derzeit listet " http://my-site.com/visningshus " alle Posts dieses Typs auf. Ich möchte stattdessen die Seite mit diesem Permalink-Slug anzeigen.

Wie kann ich Wordpress so einstellen, dass nicht der Name des Beitragstyps Vorrang hat, sondern der Permalink und die Seite angezeigt wird?

17

Am einfachsten ist es, die Archivseite für dieses CPT zu deaktivieren:

register_post_type( 'visningshus',
    array(
        [...]
        'has_archive' => false,
        [...]
    )
);

Vergiss nicht, deine Permalinks danach unter "Einstellungen> Permalinks" zu aktualisieren.

30
kraftner

Ich bin nicht hoch genug, um den Beitrag von @ Carl zu kommentieren, aber er ist die richtige Antwort (zumindest auf diese Situation, in der der page slug und benutzerdefinierte Beitragstyp slug gleich bleiben und kein Datei archive.php)

Aber seine Antwort würde Fehler mit der Paginierung geben. So vermeiden Sie Paginierungsfehler:

add_rewrite_rule('^visningshus/page/([0-9]+)','index.php?pagename=visningshus&paged=$matches[1]', 'top');

Dies überprüft die Paginierung, erfasst die Seitenzahl und zwingt sie dann auf der anderen Seite, die Seite mit dem passenden Slug zu verwenden, und fügt dann die Seitenvariable ein.

Dieses zusätzlich zum oben angegebenen 'has_archive' => false, sollte die gewünschte Funktionalität erreichen.

Stellen Sie, wie bereits erwähnt, sicher, dass Sie die Umschreiberegeln leeren, indem Sie nach dieser Änderung Einstellungen> Permalinks aufrufen.

Hoffe das hilft jemandem, denn ich weiß das hat mich sehr lange überrumpelt.

8
Andrew Herder

Tjena Henrik!

Ich denke, alles, was Sie tun müssen, ist, eine Umschreiberegel zu den Wordpress-Umschreiberegeln hinzuzufügen, die bereits erstellt wurden. Fügen Sie diesen Code-Snippet zu Ihrer functions.php Ihres Themes hinzu oder fügen Sie ihn ...

add_action('init', function () {
     add_rewrite_rule('visningshus/?$','index.php?pagename=visningshus', 'top');
     flush_rewrite_rules();
}, 1000);
4
Carl

Was es für mich behebt, ist das Setzen von Archiv als falsch, aber auch das Setzen von Hierarchisch als falsch, wenn ich meinen benutzerdefinierten Beitragstyp einrichte!

0
Adrian Sticea

Nicht stimmberechtigt, aber + für Carls Lösung sollte register_post_type haben

'has_archive' => false

Einfach. Wenn Sie jedoch mit Paginierungsproblemen konfrontiert sind, schauen Sie sich an

add_rewrite_rule

Im Folgenden finden Sie eine allgemeine Lösung, um die Paginierung für JEDEN benutzerdefinierten Posten-Typ-Slug vor dem Inhalt benutzerdefinierter Posten-Typen zu priorisieren.

// prioritize pagination over displaying custom post type content
add_action('init', function() {
  add_rewrite_rule(
    '(.?.+?)/page/?([0-9]{1,})/?$',
    'index.php?pagename=$matches[1]&paged=$matches[2]',
    'top'
  );
});

Neben dem Hinzufügen dieses Snippets sollten Sie auch sicherstellen, dass Ihr benutzerdefinierter Beitragstyp archive = false enthält.

und zu guter Letzt gehen Sie zur Seite Permalinks settings Settings> Permalinks (/wp/wp-admin/options-permalink.php) und speichern Sie die aktuellen Einstellungen, um die Linkstruktur auf der Seite zu aktualisieren.

0
jmarceli

Ich habe es gelöst, ohne den Konflikt zu lösen. Erstellen Sie eine Seite mit Slug Visningshus und schreiben Sie, was Sie wollen. Beachten Sie die ID dieser Seite.

Erstellen und passen Sie die Vorlage archive-custom-post-type.php wie gewünscht an (höchstwahrscheinlich verwenden Sie nur eine Seitenvorlage), ersetzen Sie jedoch den Loop-Teil durch

$recent = new WP_Query("page_id=your-page-id");  
while($recent->have_posts()) : $recent->the_post();
    the_content();
endwhile;

Wenn Sie dann zu http://my-site.com/visningshus gehen, sehen Sie den von der Seite verwalteten Inhalt unter der richtigen URL.

Lass es mich wissen, es funktioniert.

0
molokom