Support » Allgemeine Fragen » Eigene Seiten durch Code
Eigene Seiten durch Code
-
Hallo,
ich bastel grade an einer Seite die sich aus einer Datenbank die Namen von Songs holt. Nun möchte ich gerne das man auf die Lieder klicken kann und diese URL hier funktioniert.
http://schlimmeweihnachtslieder.de/lieder/last chrismas
Hier lande ich natürlich auf einem HTTP 404, da die Seite „last chrismas“ nicht existent ist. Es ist lediglich die Seite „lieder“ existent.
1. Frage: Wie löse ich das am saubersten? In der Vergangenheit hab ich so etwas getan wie „lieder/?id=1“. Das find ich aber uncool, da ich gerne jedes Lied von Suchmaschinen indexiert haben möchte.
2. Frage: Normalisiere ich die URL dann irgendwie um z.B. Leerzeichen zu vermeiden?
Vielen Dank!
- Dieses Thema wurde geändert vor 3 Jahren, 6 Monaten von peacefulwarri0r.
- Dieses Thema wurde geändert vor 3 Jahren, 6 Monaten von peacefulwarri0r.
- Dieses Thema wurde geändert vor 3 Jahren, 6 Monaten von peacefulwarri0r.
-
… die sich aus einer Datenbank die Namen von Songs holt
Wie hast du das denn umgesetzt? Wenn du dafür einen Custom Post Type erstellst, bekommst du für jeden Eintrag auch einen Permalink.
Noch hab ich es garnicht umgesetzt. Wollte es dieses mal besser machen 😉
Ah okay, das heißt ich erstelle einen Custom Post Type „Lied“ und wenn ein neues Lied hinzugefügt wird, erstelle ich einen neuen Post vom Typ „Lied“?
Ja, genau. Vielleicht hilft dir dazu auch dieser Beitrag weiter:
https://kinsta.com/de/blog/wordpress-benutzerdefinierte-beitragstypen/Ja, ich habe nun einen Custom Post Type und war auch in der Lage einen neuen Post mit diesem Post Type zu erstellen.
Der permalink lautet ../mantras/trust me
Leider bekomme ich nun dort einen HTTP 404.
Mir scheint noch etwas fundamentales zu fehlen?Custom Post Type: „Mantra“
Hab nun eine single-mantras.php im Child Theme erstellt. Hat jedoch auch nicht geholfen.
[root@lisa mantra]# find . ./template-parts ./template-parts/single-mantras.php ./template-mantra.php ./functions.php ./style.css ./template-mantra-add.php ./header.php
Inhalt:
<?php /* The loop */ ?> <?php while ( have_posts() ) : the_post(); ?> <div class="main-post-div"> <div class="single-page-post-heading"> <h1><?php the_title(); ?></h1> </div> <div class="content-here"> <?php the_content(); ?> </div> <div class="comment-section-here" <?php //comments_template(); ?> </div> </div> <?php endwhile; ?>
- Diese Antwort wurde geändert vor 3 Jahren, 6 Monaten von peacefulwarri0r.
- Diese Antwort wurde geändert vor 3 Jahren, 6 Monaten von peacefulwarri0r.
Das hängt einerseits davon ab, wie du den CPT angelegt hast – ist es öffentlich zugänglich?
Der Permalink eines CPT-Beitrags mit Titel „Trust me“ wird
trust-me
sein.Nach dem ich dies im Code versteckt hatte ging es:
flush_rewrite_rules();
Aber verstanden hab ich es nicht. Jetzt werden die Posts vom Custom Post Type angezeigt. Aber die WP Query im Template wird ignoriert. 🙁
<?php /** * Template Name: Mantra */ // No direct access allowed. if( ! defined( 'ABSPATH' ) ) { exit; } ?> <?php get_header(); ?> <div id="primary" class="site-content tv-container-fluid"> <div id="content" role="main"> <?php //flush_rewrite_rules(); $args = array ( 'post_type' => array( 'mantras' ), 'post_status' => array( 'publish' ), 'posts_per_page' => '-1', 'post_parent' => 0, ); $query = new WP_Query( $args ); if ( $query->have_posts() ) { while ( $query->have_posts() ) { // get post data $query->the_post(); get_template_part( 'template-parts/content', 'mantra' ); } } else { echo 'No items in "mantras" post type'; } // Restore original Post Data wp_reset_postdata(); ?> </div><!-- #content --> </div><!-- #primary --> <?php get_footer(); ?>
- Diese Antwort wurde geändert vor 3 Jahren, 6 Monaten von peacefulwarri0r.
- Diese Antwort wurde geändert vor 3 Jahren, 6 Monaten von peacefulwarri0r.
Probier mal
'post_type' => 'mantras',
.Zum Debuggen kannst du mit
if ( post_type_exists( 'mantras' ) { echo 'Custom Post Type "mantras" existiert.'; }
prüfen, ob der CPT erkannt wird. Manchmal gibt man als Titel „Bücher“ ein, hat aber den Post Type „Buch“ genannt.
get_template_part( 'template-parts/content', 'mantra' );
kann ich nicht beurteilen, weil ich nicht weiß, was intemplate-parts/content-mantra.php
vorhanden ist.Hmm ja, das Problem ist das dass Template für die Seite Mantras nicht zieht.
Es werden die Posts automatisch aufgelistet, aber ohne zutun des ausgewählten Templates.Die If-Anweisung wird auf einer anderen Seite positiv beantwortet. Bin grade ratlos warum das Template nicht angezogen wird.
Ich vermute das es an der index.php liegt. is_archive dürfte zutreffen:
if ( is_singular() ) { if ( ! $is_elementor_theme_exist || ! elementor_theme_do_location( 'single' ) ) { get_template_part( 'template-parts/single' ); } } elseif ( is_archive() || is_home() ) { if ( ! $is_elementor_theme_exist || ! elementor_theme_do_location( 'archive' ) ) { get_template_part( 'template-parts/archive' ); } } elseif ( is_search() ) { if ( ! $is_elementor_theme_exist || ! elementor_theme_do_location( 'archive' ) ) { get_template_part( 'template-parts/search' ); } } else { if ( ! $is_elementor_theme_exist || ! elementor_theme_do_location( 'single' ) ) { get_template_part( 'template-parts/404' ); } }
Das hier scheint zu funktionieren:
} elseif ( is_archive() || is_home() ) { if ($_SERVER['REQUEST_URI'] === '/mantras/') { get_template_part( 'template-parts/mantras' ); } if ( ! $is_elementor_theme_exist || ! elementor_theme_do_location( 'archive' ) ) { get_template_part( 'template-parts/archive' ); }
- Diese Antwort wurde geändert vor 3 Jahren, 6 Monaten von peacefulwarri0r.
- Diese Antwort wurde geändert vor 3 Jahren, 6 Monaten von peacefulwarri0r.
Hab es nun in der index.php wie folgt gelöst. Gefühlt kann man das besser machen? 🙂
if ( is_singular() ) { if (preg_match('#^/mantras/.*#', $_SERVER['REQUEST_URI'])){ get_template_part( 'template-parts/single-mantras' ); }elseif( ! $is_elementor_theme_exist || ! elementor_theme_do_location( 'single' ) ) { get_template_part( 'template-parts/single' ); } } elseif ( is_archive() || is_home() ) { if ($_SERVER['REQUEST_URI'] === '/mantras/') { get_template_part( 'template-parts/archive-mantras' ); }elseif ( ! $is_elementor_theme_exist || ! elementor_theme_do_location( 'archive' ) ) { get_template_part( 'template-parts/archive' ); }
- Diese Antwort wurde geändert vor 3 Jahren, 6 Monaten von peacefulwarri0r.
Hmm ja, das Problem ist das dass Template für die Seite Mantras nicht zieht.
Es werden die Posts automatisch aufgelistet, aber ohne zutun des ausgewählten Templates.Wenn du ein Template
single-$posttype.php
erstellst, wird das für die Einzelansicht des Beitrags verwendet. Für eine Beitragsübersichtsseite brauchst du ein Templatearchive-$posttype.php
.Schau dir dazu mal in der Dokumentation das Kapitel Template Hierarchy an:
Ja, das hab ich gemacht.
[root@lisa mantra]# find templat* template-parts template-parts/single-mantras.php template-parts/archive-mantras.php templates templates/mantra-add.php
Das Problem war die index.php, die verhindert hatte das diese Dateien angezogen werden. Das ist nun wie oben zu sehen gelöst. Frag mich nur noch ob man das in der index.php hübscher lösen sollte.
Auf jeden Fall vielen Dank für die Hilfe!! Ich denke das läuft nun so wie es soll.
Template Parts sind nicht Templates.
Frag mich nur noch ob man das in der index.php hübscher lösen sollte.
Ja, indem du die Template-Hierarchie verwendest.
Kurz gefasst: Wann immer ein Webseitenbesucher eine Webseite deiner WordPress-Installation aufruft, prüft WordPress zuerst, um welche Art von Inhalt (Beitrag, statische Seite, Datums-/Autoren-/Kategorien-/Schlagwort-Archiv, Suchergebnisse, Custom-Post-Type-Archiv, …) es sich handelt und versucht dazu das optimale Template zu finden. Wurde aber für den Post Type „buch“ kein
archive-buch.php
angelegt, fällt WordPress auf allgemeinere Templates zurück, zuletzt aufindex.php
. Dort kann dann immer noch mit if-Statements fallweise unterschieden werden, wie Inhalte ausgegeben werden, z.B. durch das Nachladen von Template-Parts.Den passenden Chart dazu musst du von links nach rechts lesen. Links stehen die spezifischen Templates, rechts die allgemeineren:
Okay, hab ich verstanden. Jedoch zieht er die Templates nicht an, obwohl ich sie korrekt benannt habe. Kann es sein das Unterordner im Childtheme nicht durchsucht werden?
[root@lisa mantra]# find . -type f ./template-parts/content-mantra-add.php ./template-parts/single-mantras.php ./template-parts/archive-mantras.php ./templates/mantra-add.php ./readMantraMain.php ./functions.php ./index.php ./style.css ./dbcontroller.php ./header.php
Heißt der CPT
mantras
? (Plural?)
Dann müssen die Templatessingle-mantras.php
undarchive-mantras.php
im Hauptverzeichnis des Child-Themes stehen. Sie haben wie gesagt mit Template Parts rein gar nichts zu tun.OMG. Ja, die Templates im Hauptverzeichnis funktioniert nun.
Vielen Dank!- Diese Antwort wurde geändert vor 3 Jahren, 6 Monaten von peacefulwarri0r.
- Das Thema „Eigene Seiten durch Code“ ist für neue Antworten geschlossen.