WordPress-Plugin: Canonical Permalink
04.04.2010 in: PHP, Webdesign und WordPress • 9 Kommentare
Letzte Änderung: 05.06.2010, 18:34 Uhr.
Ich habe schon darauf hingewiesen: WordPress nimmt numerische Anhänge sehr großzügig entgegen.
Ein paar dieser ungewollten Requests kann man per .htaccess umleiten; aber Francesco Schwarz hat jetzt auf ein Problem hingewiesen, das man so früh nicht abfangen kann: An jede Seiten- oder Artikeladresse kann man frei irgendwelche Zahlen anhängen.
In der .htaccess freilich kann man noch nicht wissen, ob so ein Anhang legal ist: Manche Seiten könnten auf mehrere Unterseiten aufgeteilt worden sein.
So könnte /seitenname/2/
erlaubt sein, /seitenname/3/
aber nicht, weil es keine dritte Seite gibt. Auch /seitenname/1/
ist natürlich Unfug: Diese Ausgabe ist mit der ersten Seite identisch.
Also muß ein Plugin her.
Download Plugin Canonical Permalink
Zum Gucken und für Verbesserungshinweise noch der Quellcode:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 |
<?php /* Plugin Name: Canonical Permalink Plugin URI: http://toscho.de/2010/wordpress-plugin-canonical-permalink/ Description: Removes illegal numeric suffixes from the request URI. Version: 0.3 Author: Thomas Scholz Author URI: http://toscho.de Created: 04.04.2010 */ /** * WordPress allows URIs with any numeric suffix, e.g.: * /canonical-page-or-postname/12345/ * This functions performs a simple check and redirects * to the canonical URI if neccessary. * * @return void */ function canonical_request() { global $page, $post; // post, page, attachment, preview if ( ! is_singular() or is_preview() ) { return; } $permalink = get_permalink(); // We don't have access to the number of sub pages here. // So we have to hack. $max_pages = substr_count( $post->post_content, '<!--nextpage-->') + 1; if ( 1 < $page and $page <= $max_pages ) { /* * Handle different permalink settings, eg: * /%year%/%postname%.html or * /%year%/%postname%/ */ $rev_perma_struct = strrev(get_option('permalink_structure')); if ( '/' != $rev_perma_struct[0] ) { $permalink .= "/$page"; } else { $permalink .= "$page/"; } } $host_uri = 'http' . ( empty ( $_SERVER['HTTPS'] ) ? '' : 's' ) . '://' . $_SERVER['HTTP_HOST']; $canonical_path = str_replace($host_uri, '', $permalink); if ( ! empty ( $_GET ) ) { global $wp; // Array $allowed = $wp->public_query_vars; $out_arr = array(); foreach ( $_GET as $k => $v ) { if ( in_array($k, $allowed ) ) { $out_arr[] = $k . ( empty ( $v ) ? '' : "=$v" ); } } if ( ! empty ( $out_arr ) ) { $canonical_path .= '?' . implode('&', $out_arr); } } if ( $canonical_path == $_SERVER['REQUEST_URI'] ) { return; } // Debug current result: #print '<pre>' . var_export($canonical_path, TRUE) . '</pre>'; // Change it or return 'false' to stop the redirect. $canonical_path = apply_filters( 'toscho_canonical_path', $canonical_path ); if ( FALSE != $canonical_path ) { header('Location: ' . $permalink, true, 301); die("<a href='$permalink'>$permalink</a>"); } return; } add_action('wp', 'canonical_request'); |
Thomas, wenn ich dir einen Tipp geben dürfte: is_single() or is_page() durch is_singular() ersetzen. Gibt allerdings auch bei is_attachment() ein TRUE zurück (ist aber in diesem Fall nicht verkehrt).
@Sergej Müller: Stimmt, das ist besser. Habe es umgeschrieben.
hi thomas....
using your plugin doesn't make fun at pages or articles using .
Paged links like: blog.example.com/hallo-welt/2
give me the result: blog.example.com/hallo-welt2/
...and just let me see my did not found commenting site ....sic!
using wp 2.9.2
thomas: I think
$permalink .= "$page/"
should be$permalink .= "/$page"
instead.@Erik: If the permalink already has a trailing slash, I shouldn’t add one. Anyway, I’ve updated the plugin. Try version 0.3.
sorry,
ich war 'ne Woche weg auf'm Dorf mit abenteuerlicher Internetverbindung....
Ich werde das Plug sobald ich 'n bischen Zeit hab Morgen / Übermorgen wieder versuchen....
Der Fehler kann im Übrigen damit zusammenhängen das ich - also mein Fehler! - bei den Einstellungen der Permalinks einen Slash vegessen hatte (sic! ):
also anstatt: /%postname%/
nur : /%postname%
eingetragen....
Falls das Problem damit nicht beseitigt sein sollte - was ich ja mal annehme...dann nehme ich mal Eure Vorschläge ins Visier....
bis später
Grüße thomas
@thomas: Das ist ja eine ganz legale Einstellung, damit sollte das Plugin also zurechtkommen. Ich habe es mit
/%postname%.html
getestet, und damit funktioniert die neue Fassung. Also sollte auch das bloße/%postname%
kein Problem mehr sein.na ja /%postname%/ schafft mir immerhin den Slash am Ende...und das sollte es schon sein.
Habe das Plug wieder am laufen - ohne Probleme - allerdings sehe ich nicht ganz den Erfolg:
Eine Archive Navi mit dem Ende 2010/page/1/ wird immer noch genauso bedient wie nur der Aufruf mit 2010....???
Ebenso nextpage Aufrufe nach dem Muster: hallo-welt/1/ landen genau dort wo hallo-welt/ auch landen - ebenson wie die Aufrufe die ich mit hallo-welt/99999/ bediene, wohingegen diese Aufrufe vorher ohne Plug - und das ist die einzige Änderung die ich feststellt - unmittelbar zu der Seite zurückführten von der ich gekommen war z.B. hallo-welt/2/
Da sollte nun doch eigentlich "Seite nicht gefunden" kommen....????
schöne grüße
thomas
...aber noch als Ergänzung:
immerhin Archiv Aufrufe nach dem Muster 2010/page/2222222222/ führen nun allerdings doch zur nicht gefundenen Seite.....
Aber nextpage Aufrufe nach dem Muster hallo-welt/222222222222/ führen zu hallo-welt