✅ WEB- och WordPress -nyheter, teman, plugins. Här delar vi tips och bästa webbplatslösningar.

Handledning: Anpassade URL-slutpunkter med WordPress Rewrite API

7

Har du någonsin önskat att du kunde utöka enstaka inlägg, sidor eller dina anpassade inläggstyper med en anpassad mall som har en egen URL-struktur? Med WordPress Rewrite API är detta fullt möjligt, och inte alls svårt.

I den här handledningen kommer vi att titta på hur man lägger till en anpassad inläggsvy med en annan slug som laddar en annan mall. Med andra ord, om ett enskilt inlägg av typen anpassad inlägg har webbadressen "example.com/destination/venice/", kan du lägga till URL-regler för separata sidor med relaterad information till varje destination, till exempel"example.com/destination/venice /activities/" och “example.com/destination/venice/attractions/”.

Om du är intresserad av hur man lägger till slutpunkter på WooCommerces "Mitt konto"-sida, har jag ett annat inlägg om just det!

WordPress Rewrite API har massor av användbara funktioner för att skriva dina egna anpassade URL-regler. Du kanske har sett den mest kända och breda funktionen; add_rewrite_rule(). Denna handledning använder dock liknande add_rewrite_endpoint(), vilket är mycket användbart för att lägga till URL-“slutpunkter” (i princip lägga till anpassade URL-sluggar efter något som redan finns, t.ex. efter slutet av ett enstaka inlägg eller en enda kategori). Du kan uppnå samma resultat genom att använda add_rewrite_rule()men processen att lägga till slutpunkter är enklare.

Vad vi ska göra

Denna guide kommer att anta att vi har skapat två anpassade inläggstyper; "film" och "skådespelare". Permalänkregeln för en enskild film är "example.com/movie/fight-club/" och för en enskild skådespelare "example.com/actor/brad-pitt/". Vi vill ha en separat sida för varje film som visar alla skådespelare i den filmen, som finns på "example.com/movie/fight-club/actors/" och på samma sätt en separat sida för varje skådespelare som visar alla filmer som skådespelaren har varit med i, finns på "example.com/actor/brad-pitt/movies/".

Jag kommer inte att gå in på detaljer om hur man lägger till dessa två anpassade inläggstyper; om du behöver hjälp med att göra den här delen rekommenderar jag att du läser mitt inlägg om hur du lägger till anpassade inläggstyper.

Skriver koden

Första steget är att anropa add_rewrite_endpoint()en funktion som är kopplad till init(i allmänhet är alla funktioner i Rewrite API kopplade till init). att registrera våra två önskade slutpunkter; "filmer" och "skådespelare". Funktionen tar två argument; först den slutpunkt du vill ha (t.ex. ‘filmer’), och för det andra en konstant för var slutpunkten ska "leva" (t.ex. sidor, författare, arkiv, etc). Titta i dokumentationen för vilka konstanter du kan använda; När det gäller detta exempel är det allmänna EP_PERMALINKbra:

add_action('init', function() { add_rewrite_endpoint('movies', EP_PERMALINK); add_rewrite_endpoint('actors', EP_PERMALINK); });

OBS: Om din anpassade inläggstyp är hierarkisk, vilket betyder att den har 'hierarchical' => truei sin register_post_type(), måste du byta ut konstanten EP_PERMALINKmed EP_PAGES.

När du har sparat den här koden måste du gå till Inställningar > Permalänkar och klicka på knappen Spara för att uppdatera permanenta länkar. När du lägger till eller ändrar en omskrivningsregel måste du uppdatera dina permalänkar för att det ska fungera!

Hantera frågan vars

Sättet som du som tema- eller plugin-utvecklare kan ta reda på om du vill visa mallarna för dessa slutpunkter eller inte, är genom att markera "query vars"; i princip WordPress globala frågeobjekt. Vi gör detta genom att anropa get_query_var()med frågan som argument (‘filmer’ eller ‘skådespelare’).

Om du har arbetat med add_rewrite_rule()eller get_query_var()tidigare kanske du redan är medveten om att WordPress inte automatiskt lägger till anpassade frågevarianter. Vanligtvis måste du filtrera query_varsoch lägga till dina anpassade variabler för att få WordPress att fylla i dem. Men add_rewrite_endpoint()automatiskt gör detta för oss.

Men om vi försöker ringa get_query_var('movies')kommer det aldrig att tyckas vara inställt. Det beror på att det antar att det måste ha ett värde för att kunna ställas in. Endpoint-regler förutsätter att det som kommer efter endpointen är värdet. Till exempel "example.com/actor/brad-pitt/movies/some-value/" skulle fungera, eftersom på den här sidan get_query_var('movies')skulle returnera värdet "some-value". Men det är inte vad vi vill, vi vill att det ska fungera enbart med den enda slutpunkten. För att lösa detta måste vi ansluta till WordPress requestfilter och informera WordPress om att om vi är vid våra slutpunkter, bör frågan vars lägga till slutpunkten med något värde (vi ställer bara in det till true).

add_filter('request', function($vars) { if (isset($vars['movies'])) { $vars['movies'] = true; } if (isset($vars['actors'])) { $vars['actors'] = true; } return $vars; });

Om du nu försöker använda get_query_vars('movies')när på "example.com/actor/brad-pitt/movies/" skulle du få värdet true(det viktiga är att det faktiskt har ställts in).

Laddar mall

Nästa steg är att bestämma vad som ska hända på dessa två endpoints; eller med andra ord vilka mallar du vill ladda. Den här delen är upp till dig, du kan haka på template_redirectmen det rekommenderas egentligen bara om du vill utföra en faktisk omdirigering. Jag rekommenderar att du kopplar in template_includefiltret och berättar helt enkelt för WordPress vilka mallar som ska användas när vi är vid våra anpassade slutpunkter. Låt oss anta att temat har PHP-mallarna single-actor-movies.phpför "example.com/actor//movies/ och single-movie-actors.phpför "example.com/movie//actors/".

add_filter('template_include', function($template) { if (is_singular() && get_query_var('movies')) { $post = get_queried_object(); return locate_template(['single-actor-movies.php']); } if (is_singular() && get_query_var('actors')) { $post = get_queried_object(); return locate_template(['single-movie-actors.php']); } return $template; });

Med detta filter på plats bör WordPress ladda de tillhandahållna mallarna för våra anpassade slutpunkter, och inom dessa mallar skulle det globala $postobjektet vara det relaterade enstaka postobjektet före slutpunkten – t.ex. enaktörspostobjektet när vi är vid mallen för att visa alla filmer som skådespelaren har medverkat i. Detta gör det enkelt för oss att fråga efter den information vi vill visa.

Hämta URL:en till din slutpunkt

Att ha våra anpassade slutpunkter och sidor är helt okej, men någonstans skulle du behöva länka till dem. Till exempel i singelfilmsmallen vill du ha en länk "Se alla skådespelare" som går till din slutpunkt.

Tyvärr finns det ingen så enkel WordPress-funktion för detta. Du måste bygga webbadressen själv. Jag rekommenderar att du använder [get_site_url](https://developer.wordpress.org/reference/functions/get_site_url/)()för ändpunkter som omfattar hela webbplatsen, eller i ovanstående fall hänvisar du till ett specifikt inlägg med [get_the_permalink](https://developer.wordpress.org/reference/functions/get_the_permalink/)()(antingen i slingan eller genom att ange ett inläggs-ID) och lägger till ändpunkten efter det, som så:

echo get_the_permalink(). '/actors';

Inspelningskälla: awhitepixel.com

Denna webbplats använder cookies för att förbättra din upplevelse. Vi antar att du är ok med detta, men du kan välja bort det om du vill. Jag accepterar Fler detaljer