Support » Allgemeine Fragen » Eigene Seiten durch Code

  • Gelöst peacefulwarri0r

    (@peacefulwarri0r)


    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.
Ansicht von 15 Antworten - 1 bis 15 (von insgesamt 15)
  • … 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.

    Thread-Starter peacefulwarri0r

    (@peacefulwarri0r)

    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/

    Thread-Starter peacefulwarri0r

    (@peacefulwarri0r)

    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.

    Thread-Starter peacefulwarri0r

    (@peacefulwarri0r)

    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 in template-parts/content-mantra.php vorhanden ist.

    Thread-Starter peacefulwarri0r

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

    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.
    Thread-Starter peacefulwarri0r

    (@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 Template archive-$posttype.php.

    Schau dir dazu mal in der Dokumentation das Kapitel Template Hierarchy an:

    Home

    Thread-Starter peacefulwarri0r

    (@peacefulwarri0r)

    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 auf index.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:

    Screenshot Template-Hierarchy

    Thread-Starter peacefulwarri0r

    (@peacefulwarri0r)

    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 Templates single-mantras.php und archive-mantras.php im Hauptverzeichnis des Child-Themes stehen. Sie haben wie gesagt mit Template Parts rein gar nichts zu tun.

    Thread-Starter peacefulwarri0r

    (@peacefulwarri0r)

    OMG. Ja, die Templates im Hauptverzeichnis funktioniert nun.
    Vielen Dank!

    • Diese Antwort wurde geändert vor 3 Jahren, 6 Monaten von peacefulwarri0r.
Ansicht von 15 Antworten - 1 bis 15 (von insgesamt 15)
  • Das Thema „Eigene Seiten durch Code“ ist für neue Antworten geschlossen.