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

18

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?

Henrik Erlandsson
quelle

Antworten:

32

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.

Kraftner
quelle
1
Perfekt funktioniert - aber jetzt geben alle Permalinks, die mit dem Namen des benutzerdefinierten Post-Typs beginnen, eine 404, obwohl sie in wp-admin korrekt sind und anscheinend kein Umschreiben stattfindet. Das heißt, alle Permalinks auf der Site sind korrekt, aber alle benutzerdefinierten Posts geben eine 404 an. Können Sie dabei helfen? :)
Henrik Erlandsson
@HenrikErlandsson Vielleicht hat Ihr Beitragstyp den gleichen Namen wie die Seite. In diesem Fall empfehle ich Ihnen, den Namen Ihres Beitragstyps zu ändern. Beispiel: Name des benutzerdefinierten Beitragstyps - Vorher: Produkte Nachher: ​​cpt_products.
Bruno Monteiro
Sehr intelligent. Behebt eine Reihe von Problemen
bysanchy
8

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 Seiten- und der benutzerdefinierte Beitragstyp beibehalten werden) und keine archive.php-Datei verwendet wird).

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.

Dies zusätzlich zu'has_archive' => false, oben angegebenen Funktionen 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 schon sehr lange ratlos gemacht.

Andrew Herder
quelle
4

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 Themas hinzu oder fügen Sie ihn ...

add_action('init', function () {
     add_rewrite_rule('visningshus/?$','index.php?pagename=visningshus', 'top');
     flush_rewrite_rules();
}, 1000);
Carl
quelle
4
Wenn dies von jemandem verwendet wird, entfernen flush_rewrite_rules();Sie sollten die Umschreiberegeln nicht initjedes Mal ändern . Einmal neu laden, dann entfernen oder Permalinks manuell löschen, indem Sie zu den Permalink-Einstellungen im Admin-Dashboard gehen und auf "Save Changes"
speichern)
0

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.

molokom
quelle
Gute Idee, aber das ist zu kompliziert. Hast du meine Lösung ausprobiert?
Kraftner
@kraftner nein habe ich nicht. Ich werde es das nächste Mal versuchen. Vielen Dank!
Molokom
Dies hat auch einige Nebenwirkungen wie die Kopfzeile und alles, was noch erstellt wird, als wäre es eine Archivseite und keine Seite. Ich würde nicht raten, diese Lösung zu verwenden.
Kraftner
Was ist, wenn sich die Seiten-ID ändert? Das ist nicht sicher.
Joel James
0

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
Vitali Protosovitski
quelle
0

Was es für mich behebt, ist das Setzen von archive als false, aber auch das Setzen von hierarchical auf false beim Einrichten meines benutzerdefinierten Beitragstyps!

Adrian Sticea
quelle
0

Hier ist 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 über Folgendes verfügt archive = false

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

jmarceli
quelle