Support » Plugins » Custom Post Fields -> URL Rewrite

  • Hallo Ihr Lieben,

    ich suche eine Lösung für folgendes Problem:

    Ich habe per Custom Postfields UI (CPT UI) ein Post Type Field Set angelegt.
    Name Profiles und natürlich die entsprechenden Templates:

    archive-profile.php
    single-profile.php

    das funktioniert auch soweit.

    aufgerufen wird das dann logischerweise über
    domain.de/profile
    domain.de/profile/profil-name

    Ich möchte jetzt aber, wenn man domain.de/eigenschaft eingibt, dass er die archive-single.php nutzt und dort nur Werte anzeigt wo der META-Key „BeliebigeEigenschaft“ vorhanden ist.

    Wenn der WP_QUERY -> COUNT = 1 ist, soll er die single.php aufrufen und die Daten zur Person darstellen, wenn Counter > 1 ist, soll er auf der Archive-Profile.php bleiben.

    Den Filter in PHP habe ich drin. Ich benötige aber den add_filter / die RewriteRule um das ganze per $_GET abfragen und darstellen zu können.

    Ich hoffe, dass ist verständlich genug ausgedrückt und jemand hat hier eine pfiffige Idee.

    Vielen Dank!

Ansicht von 4 Antworten - 1 bis 4 (von insgesamt 4)
  • Uiuiui, das wird schwierig: pfiffige Ideen haben wir hier fast nie. 🙄

    Der Begriff „Custom Postfields“ ist etwas irreführend, weil es ein Mischmasch aus „Custom Post Type“ (einer eigenen Inhaltsart) und „Custom Fields“ (eigenen Feldern für Post-Meta) ist. Wenn du aber „Profile“ angelegt hast, gehe ich mal davon aus, dass du einen Custom Post Type meinst.

    WordPress verwendet bei der Darstellung eine Template Hierarchie und zieht automatisch das am besten passende Template, fällt aber wenn es kein spezielles Template gibt auf allgemeinere Templates zurück.
    Die Unterscheidung „Wenn der WP_QUERY -> COUNT = 1 ist, soll er die single.php aufrufen “ trifft WordPress also ganz automatisch (vorausgesetzt, es gibt keine spezifischere single-profile.php). Hier brauchst du also gar nicht aktiv werden, nur ggf. ein schon angelegtes Template single-profile.php löschen.

    Komplizierter wird es nun bei dem Archiv, weil du hier einschränkend nur die Beiträge anzeigen möchtest, die gleichzeitig ein eigenes Feld (Custom Field) „BeliebigeEigenschaft“ gefüllt haben. Damit du nach einer Abfrage aller Beiträge des Custom Post Type nicht von vorne anfangen musst, erstellst du dafür einen Filter für den Hook pre_get_posts:

    add_action( 'pre_get_posts', 'nur_bestimmte_profile' );
    function nur_bestimmte_profile( $query ) {
      // do not modify queries in the admin
      if( is_admin() ) {
        return $query;	
      }
    
     // only modify queries for 'profile' post type
     if( isset($query->query_vars['post_type']) && $query->query_vars['post_type'] == 'profile' ) {
    		
        // allow the url to alter the query
        if( isset($_GET['eigenschaft']) ) {
          $query->set('meta_key', 'BeliebigeEigenschaft');
          $query->set('meta_value', $_GET['eigenschaft']);
        } 
      }
    
    }

    Weil ich nicht so pfiffig bin, habe ich die Funktion aus der Doku von Advanced Custom Fields kopiert und nicht weiter getestet, aber sinngemäß sollte es passen.

    Übrigens bisst du mit Fragen zur Programmierung bei StackExchange besser aufgehoben. Die sind da echt pfiffig.

    Thread-Ersteller berlinux

    (@berlinux)

    Hallo Mario,

    vielen Dank für dein Feedback.

    Ich glaube aber Du hast mich nicht ganz verstanden.

    Ja, ich nutze die Custom Post Types UI, dort gibt das Custom Post Type (Page) ‚Profile‘ dieses wird wiederum gefüttert durch Custom Fields.

    Dies widerum füttert die single-profile.php und archive.php und wird über /profile bzw. /profile/name des Profil-Beitrages aufgerufen. Soweit so gut.

    Ich möchte jetzt aber, wenn jetzt jemand in die Adresszeile domain.de/person/name_der/person eingibt, dass wenn es mehrere Personen in der DB gibt, er nur die Inhalte zu dieser Person anzeigt. Wenn es nur eine Person gibt, er natürlich den Beitrag direkt anzeigt (in dem Fall: single-Profile.php mit den Daten zu dieser Request URI).

    Deswegen das COUNT > 1 oder COUNT == 1

    eine RewriteRULE per .htaccess nach dem Prinzip
    person/person(.*)$ wp-content/themes/design/archive-profile.php?variable=$1 führt folglich nicht zum Ergebnis.

    Ich glaube aber Du hast mich nicht ganz verstanden.

    Das ist bei den munter verwechselten Begriffen gut möglich.

    Ich möchte jetzt aber, wenn jetzt jemand in die Adresszeile domain.de/person/name_der/person eingibt, dass wenn es mehrere Personen in der DB gibt, er nur die Inhalte zu dieser Person anzeigt.

    Du kannst bei jedem Eintrag für deinen Custom Post Type nur einen einmaligen Slug verwenden. Hast du z.B. zweimal „Sabine Schmitz“, wird das als https://example.com/profile/sabine-schmitz und https://example.com/profile/sabine-schmitz-2 gespeichert.

    In deinem Beispiel hast du jetzt auch das Post-Meta weggelassen. Es ist schwer zu helfen, wenn mittendrin die Frage geändert wird.

    Thread-Ersteller berlinux

    (@berlinux)

    Hallo Mario,
    eigentlich hatte ich nicht’s geändert / weg gelassen.

    Das Custom Type ist „profil“ für diese existieren:

    archive-profile.php (für die Archiv-Seite)
    und
    die single-profile.php

    Rufe ich jetzt Domain.de/profile auf, zeigt er mir das Archiv und rufe ich domain.de/profile/hans-meisner auf, zeigt er mir das Profil von Hans Meisner.

    Soweit so gut. Ich möchte jetzt aber, wenn man domain.de/person/schmidt aufruft, dass er mir im Archiv alle Einträge mit „Schmidt“ zeigt und wenn dieses Ergebnis nur 1x vorkommt, er natürlich auf domain.de/profile/hans-schmidt springt. Also quasi den Eintrag in der DB sucht und automatisch darauf umleitet.

    Der folgende Code in der archiv-datei:

    if(!empty($p) && strlen($p) >= 4){
    
    $args = array(
    					'post_type' => 'profile',
    					'meta_key'		=> 'position',
    					'meta_value'	=> $p,
    					'orderby'   => 'date',
    					'order'     => 'DESC'
    			);
    			$search = 1;
    if($search == 1) {
    			$query = new WP_Query( $args );
    		
    			if($query->post_count == 1 && !empty($vorname) && !empty($vorname))  {
    				header('location:https://domain.de/profile/'. $vorname.'-'. $nachname);
    			}
    			if($query->post_count == 0) {
    				echo'Keine Datensätze vorhanden.';
    			}
    		}
    		else {
    			$args = array(
    					'post_type' => 'profile',
    					'orderby'   => 'date',
    					'order'     => 'DESC'
    			);
    			$query = new WP_Query($args);
    		//while ( ($search == 1 ? $s1 : $barcelona_q->have_posts()) ): ($search == 1 ? $2 : $barcelona_q->the_post());
    while ( $query->have_posts() ) : $query->the_post();

    funktioniert ja auch, wenn ich die Variable $p fest definieren. Logisch, weil ich den $_GET[‚p‘] ja nicht übergeben kann.

    • Diese Antwort wurde geändert vor 4 Monaten, 4 Wochen von berlinux.
Ansicht von 4 Antworten - 1 bis 4 (von insgesamt 4)