Short description of the problem
So the problem is basically that when I use subcategories in the translated version of the site with wpml it generates a 404 page. In the parent category I can still see the post and navigate to it without a problem. And ofc, it all works fine in the none translated version.
My question
So my question is if anybody else have had this problem and if so, how did you resolve it?
Hopefully helpful information
Software
- PHP – 5.2
- WordPress – 3.3.2
- WPML Multilingual CMS – 2.4.3
- WPML String Translation – 1.3.0
Permalink settings
/%category%/%postname%/
What I’ve tried
- I tried deactivating all other plugins
- Tried flushing the permalinks â¹ edit
Additional information
- It seems that the url’s to the subcategories is perceived as a “page” â¹ edit
- If we instead manually go directly to the url but subtract the parent category from the url we get to the expected category archive page â¹ edit
Example:http://domain.com/en/super/sub/
->http://domain.com/en/sub/
My .htaccess -file:
# BEGIN Redirects
RedirectMatch 301 ^/okategoriserade/(.*)$ /webb/$1
RedirectMatch 301 ^/apache2/(.*)$ /apache/$1
RedirectMatch 301 ^/server/(.*)$ /linux/$1
RedirectMatch 301 ^/etiketter/(.*)$ /tag/$1
RedirectMatch 301 ^/kategorier/(.*)$ /$1
RedirectMatch 301 ^/en/php-en/zf2/(.*)$ /en/zf2/$1
RedirectMatch 301 ^/media/me-avatar-e1332014347355.png(.*)$ /media/erik-landvall.png$1
RedirectMatch 301 ^/jquery/(.*)$ /javascript/jquery/$1
# END Redirects
# BEGIN W3TC Browser Cache
<IfModule mod_mime.c>
AddType text/css .css
AddType application/x-javascript .js
AddType text/x-component .htc
AddType text/html .html .htm
AddType text/richtext .rtf .rtx
AddType image/svg+xml .svg .svgz
AddType text/plain .txt
AddType text/xsd .xsd
AddType text/xsl .xsl
AddType text/xml .xml
AddType video/asf .asf .asx .wax .wmv .wmx
AddType video/avi .avi
AddType image/bmp .bmp
AddType application/java .class
AddType video/divx .divx
AddType application/msword .doc .docx
AddType application/vnd.ms-fontobject .eot
AddType application/x-msdownload .exe
AddType image/gif .gif
AddType application/x-gzip .gz .gzip
AddType image/x-icon .ico
AddType image/jpeg .jpg .jpeg .jpe
AddType application/vnd.ms-access .mdb
AddType audio/midi .mid .midi
AddType video/quicktime .mov .qt
AddType audio/mpeg .mp3 .m4a
AddType video/mp4 .mp4 .m4v
AddType video/mpeg .mpeg .mpg .mpe
AddType application/vnd.ms-project .mpp
AddType application/x-font-otf .otf
AddType application/vnd.oasis.opendocument.database .odb
AddType application/vnd.oasis.opendocument.chart .odc
AddType application/vnd.oasis.opendocument.formula .odf
AddType application/vnd.oasis.opendocument.graphics .odg
AddType application/vnd.oasis.opendocument.presentation .odp
AddType application/vnd.oasis.opendocument.spreadsheet .ods
AddType application/vnd.oasis.opendocument.text .odt
AddType audio/ogg .ogg
AddType application/pdf .pdf
AddType image/png .png
AddType application/vnd.ms-powerpoint .pot .pps .ppt .pptx
AddType audio/x-realaudio .ra .ram
AddType application/x-shockwave-flash .swf
AddType application/x-tar .tar
AddType image/tiff .tif .tiff
AddType application/x-font-ttf .ttf .ttc
AddType audio/wav .wav
AddType audio/wma .wma
AddType application/vnd.ms-write .wri
AddType application/vnd.ms-excel .xla .xls .xlsx .xlt .xlw
AddType application/zip .zip
</IfModule>
<IfModule mod_expires.c>
ExpiresActive On
ExpiresByType text/css A31536000
ExpiresByType application/x-javascript A31536000
ExpiresByType text/x-component A31536000
ExpiresByType text/html A3600
ExpiresByType text/richtext A3600
ExpiresByType image/svg+xml A3600
ExpiresByType text/plain A3600
ExpiresByType text/xsd A3600
ExpiresByType text/xsl A3600
ExpiresByType text/xml A3600
ExpiresByType video/asf A31536000
ExpiresByType video/avi A31536000
ExpiresByType image/bmp A31536000
ExpiresByType application/java A31536000
ExpiresByType video/divx A31536000
ExpiresByType application/msword A31536000
ExpiresByType application/vnd.ms-fontobject A31536000
ExpiresByType application/x-msdownload A31536000
ExpiresByType image/gif A31536000
ExpiresByType application/x-gzip A31536000
ExpiresByType image/x-icon A31536000
ExpiresByType image/jpeg A31536000
ExpiresByType application/vnd.ms-access A31536000
ExpiresByType audio/midi A31536000
ExpiresByType video/quicktime A31536000
ExpiresByType audio/mpeg A31536000
ExpiresByType video/mp4 A31536000
ExpiresByType video/mpeg A31536000
ExpiresByType application/vnd.ms-project A31536000
ExpiresByType application/x-font-otf A31536000
ExpiresByType application/vnd.oasis.opendocument.database A31536000
ExpiresByType application/vnd.oasis.opendocument.chart A31536000
ExpiresByType application/vnd.oasis.opendocument.formula A31536000
ExpiresByType application/vnd.oasis.opendocument.graphics A31536000
ExpiresByType application/vnd.oasis.opendocument.presentation A31536000
ExpiresByType application/vnd.oasis.opendocument.spreadsheet A31536000
ExpiresByType application/vnd.oasis.opendocument.text A31536000
ExpiresByType audio/ogg A31536000
ExpiresByType application/pdf A31536000
ExpiresByType image/png A31536000
ExpiresByType application/vnd.ms-powerpoint A31536000
ExpiresByType audio/x-realaudio A31536000
ExpiresByType image/svg+xml A31536000
ExpiresByType application/x-shockwave-flash A31536000
ExpiresByType application/x-tar A31536000
ExpiresByType image/tiff A31536000
ExpiresByType application/x-font-ttf A31536000
ExpiresByType audio/wav A31536000
ExpiresByType audio/wma A31536000
ExpiresByType application/vnd.ms-write A31536000
ExpiresByType application/vnd.ms-excel A31536000
ExpiresByType application/zip A31536000
</IfModule>
<IfModule mod_deflate.c>
<IfModule mod_setenvif.c>
BrowserMatch ^Mozilla/4 gzip-only-text/html
BrowserMatch ^Mozilla/4.0[678] no-gzip
BrowserMatch bMSIE !no-gzip !gzip-only-text/html
BrowserMatch bMSI[E] !no-gzip !gzip-only-text/html
</IfModule>
<IfModule mod_headers.c>
Header append Vary User-Agent env=!dont-vary
</IfModule>
<IfModule mod_filter.c>
AddOutputFilterByType DEFLATE text/css application/x-javascript text/x-component text/html text/richtext image/svg+xml text/plain text/xsd text/xsl text/xml image/x-icon
</IfModule>
</IfModule>
<FilesMatch ".(css|js|htc|CSS|JS|HTC)$">
<IfModule mod_headers.c>
Header set Pragma "public"
Header append Cache-Control "public, must-revalidate, proxy-revalidate"
</IfModule>
FileETag MTime Size
<IfModule mod_headers.c>
Header set X-Powered-By "W3 Total Cache/0.9.2.4"
</IfModule>
</FilesMatch>
<FilesMatch ".(html|htm|rtf|rtx|svg|svgz|txt|xsd|xsl|xml|HTML|HTM|RTF|RTX|SVG|SVGZ|TXT|XSD|XSL|XML)$">
<IfModule mod_headers.c>
Header set Pragma "public"
Header append Cache-Control "public, must-revalidate, proxy-revalidate"
</IfModule>
FileETag MTime Size
<IfModule mod_headers.c>
Header set X-Powered-By "W3 Total Cache/0.9.2.4"
</IfModule>
</FilesMatch>
<FilesMatch ".(asf|asx|wax|wmv|wmx|avi|bmp|class|divx|doc|docx|eot|exe|gif|gz|gzip|ico|jpg|jpeg|jpe|mdb|mid|midi|mov|qt|mp3|m4a|mp4|m4v|mpeg|mpg|mpe|mpp|otf|odb|odc|odf|odg|odp|ods|odt|ogg|pdf|png|pot|pps|ppt|pptx|ra|ram|svg|svgz|swf|tar|tif|tiff|ttf|ttc|wav|wma|wri|xla|xls|xlsx|xlt|xlw|zip|ASF|ASX|WAX|WMV|WMX|AVI|BMP|CLASS|DIVX|DOC|DOCX|EOT|EXE|GIF|GZ|GZIP|ICO|JPG|JPEG|JPE|MDB|MID|MIDI|MOV|QT|MP3|M4A|MP4|M4V|MPEG|MPG|MPE|MPP|OTF|ODB|ODC|ODF|ODG|ODP|ODS|ODT|OGG|PDF|PNG|POT|PPS|PPT|PPTX|RA|RAM|SVG|SVGZ|SWF|TAR|TIF|TIFF|TTF|TTC|WAV|WMA|WRI|XLA|XLS|XLSX|XLT|XLW|ZIP)$">
<IfModule mod_headers.c>
Header set Pragma "public"
Header append Cache-Control "public, must-revalidate, proxy-revalidate"
</IfModule>
FileETag MTime Size
<IfModule mod_headers.c>
Header set X-Powered-By "W3 Total Cache/0.9.2.4"
</IfModule>
</FilesMatch>
# END W3TC Browser Cache
# BEGIN W3TC Page Cache core
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^(.*/)?w3tc_rewrite_test$ $1?w3tc_rewrite_test=1 [L]
RewriteCond %{HTTP:Accept-Encoding} gzip
RewriteRule .* - [E=W3TC_ENC:_gzip]
RewriteCond %{REQUEST_METHOD} !=POST
RewriteCond %{QUERY_STRING} =""
RewriteCond %{HTTP_HOST} =erik.landvall.se
RewriteCond %{REQUEST_URI} /$ [OR]
RewriteCond %{REQUEST_URI} (sitemap(_index)?.xml(.gz)?|[a-z0-9_-]+-sitemap([0-9]+)?.xml(.gz)?) [NC]
RewriteCond %{REQUEST_URI} !(/wp-admin/|/xmlrpc.php|/wp-(app|cron|login|register|mail).php|/feed/|wp-.*.php|index.php) [NC,OR]
RewriteCond %{REQUEST_URI} (wp-comments-popup.php|wp-links-opml.php|wp-locations.php) [NC]
RewriteCond %{HTTP_COOKIE} !(comment_author|wp-postpass) [NC]
RewriteCond %{HTTP_USER_AGENT} !(W3 Total Cache/0.9.2.4) [NC]
RewriteCond "%{DOCUMENT_ROOT}/wp-content/w3tc/pgcache/%{REQUEST_URI}/_index%{ENV:W3TC_UA}%{ENV:W3TC_REF}%{ENV:W3TC_SSL}.html%{ENV:W3TC_ENC}" -F
RewriteRule .* "/wp-content/w3tc/pgcache/%{REQUEST_URI}/_index%{ENV:W3TC_UA}%{ENV:W3TC_REF}%{ENV:W3TC_SSL}.html%{ENV:W3TC_ENC}" [L]
</IfModule>
# END W3TC Page Cache core
# BEGIN WordPress
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^index.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>
# END WordPress
DirectoryIndex index.php index.html index.htm
External resources
Information related to the question on external sites.
My blog
The page where I have the problem and where you can view it until I’ve resolved the matter. I have removed the sub categories from the translated version of the web page for UX and SEO reasons.
- Swedish: http://erik.landvall.se
- English: http://erik.landvall.se/en
The translation isn’t complete at this time witch is the reason for the content differ.
wpml.org
I found a topic on wplm.org posted 2 years ago that describes my problem exactly. I read the ansers but the thread ended without being resolved, unfortunately.
Quoted from http://wpml.org/forums/topic/error-on-subcategories/
there seems to be a problem with subcategories in wordpress. I’m using
wordpress 2.92 and when I switch to a subcategory it shows me the 404
error page. But the posts do appear in the main category, when I
switch back to it. This problems don’t occur in the main language,
only in the other languages. So when I’m in the main language, the
posts appear under the subcategory and the main category, just not in
the other languages, where they appear only in the main language.
PLEASE CHECK THE UPDATE BELOW.
The solution to this problem is in your Apache configuration. You need to alter the regular expression that turns paths into parameters for WordPress’s index.php file.
WordPress is a very high-level system working on PHP which itself is a very high level system too. WordPress does not have access to urls as they reach to server. It only has its index.php file and it needs requests to come to this file so it can handle the request.
To make this possible, they use mod_rewrite, an Apache module which modifies requests before server decides what to do with the request.
Please check your server’s error logs. You will see the real files the server tried to access. Also, please check
.htaccess
files WordPress created in folders. In these files, you will see regular expressions that mod_rewrite uses.I have checked your blog and it looks like you have already solved this. I still wanted to write so others having the same issue can benefit. Especially after seeing your mention of another post at somewhere else from two years ago being unsolved.
UPDATE:
I am glad that I had told that “I am almost sure…” 😀 (referring to comments to this answer) It looks like things are a little different than the situation I solved a few years ago.
I have checked WordPress code and made some trials. I had originally thought that WordPress cannot find the article because of /en/ however I was wrong. The default behavior of WordPress to find a post from a url covers the situation as a kind-of-positive side effect: Let’s say I do not have any plugins, or any language so
/en/
means nothing to WordPress.When I want to browse to
erik.landvall.se/en/
it returns 404 as expected. However, if we have a category structure asabc/cde/efg/
and an article asmoo
which can be accessed atabc/cde/efg/moo
; when I alter the category part of the link, WordPress automatically redirects me toabc/cde/efg/moo
:en/abc/cde/efg/moo
abc/efg/moo
cde/efg/moo
…
all redirects to
abc/cde/efg/moo
. At your blog, I have seen the same behavior except for en/ which brings your plugins into the scene. It is now obvious that plugin handles url structure in a different way than WordPress originally does or causes change in the original behavior in another way.I wanted to check plugin source as I promised; but I saw that it is not possible for me now, because it is a product I have to purchase to be able to see the source and I am not willing to buy something which I will never use 🙂
Since you said “In the parent category I can still see the post and navigate to it without a problem.” I thought removing subcategories from url. This is a pretty dirty hack; but better than editing the plugin.
We put this ugly php file,
fix_lang_subcategory.php
, to our root folder:After this, you should see WordPress’s 404 file at /fix_lang_subcategory.php successfully. If it works, we can edit our .htaccess file.
At the end of your .htaccess file, after
lines, we add this line:
What we do here is that we change the entry point with our silly php file from wordpress’s index.php to be able to run a few lines of php without touching original sources. This works only for /en/ part of the site. Rest works as it does now. In our php file, we check if we are seeing a link with subcategories and if there is, we alter (this is not a nice thing!) REQUEST_URI as below:
to
then we leave WordPress to do its job normally.
If the plugin works differently when you enable subcategories, then this can cause redirection of subcategoried pages under /en/.
A Better Solution:
I had thought you did not want to use subdomains for alternative languages; but then I saw “Can you host a version of the translated blog in a subdirectory/subdomain?” on comments to your question and in your reply, it looks like mention of subdirectory caused a misunderstanding. As I saw it on the ML plugin’s website, you can use a subdomain instead of a folder which will save you from all the trouble, probably:
Instead of
http://erik.landvall.se/en
you may usehttp://en.erik.landvall.se/
? Maybe?An Even Better Solution:
90% of chance that ML Plugin causes this and they have to fix it. Starting a support ticket might help them realize their problem and fix it for everybody else.