WPML> Subcategory Pages Generate 404 <WordPress

Brief Description of the Problem

So the problem is that when I use subcategories in the translated version of the site using wpml, it creates a 404 page. In the parent category, I can still see the message and navigate to it without problems. And cc, everything works fine in no translated version.

My question

So my question is: if someone else ran into this problem, and if so, how did you resolve it?


We hope useful information.

Software

  • PHP - 5.2
  • WordPress - 3.3.2
  • Multilingual CMS WPML - 2.4.3
  • WPML String Translation - 1.3.0

Permanent Link Options

/%category%/%postname%/

What i tried

  • I tried to disable all other plugins
  • Test permalinks

Additional Information

  • It seems that the subcategory url is perceived as a "page"
  • If instead we manually go directly to the URL, but subtract the parent category from the URL, we will go to the page of the expected archive category
    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 issue on external sites.

My blog

The page where I have a problem and where you can view it until I resolve the problem. . I removed subcategories from the translated version of the webpage for UX and SEO reasons.

The translation was not completed at this time, the reason is that the content is different.

wpml.org

I found a topic on wplm.org, published 2 years ago, that accurately describes my problem. I read ansers, but the thread ended without permission, unfortunately.

Quote from http://wpml.org/forums/topic/error-on-subcategories/

seems to be a problem with subcategories in wordpress. I am using wordpress 2.92, and when I switch to a subcategory, it shows me a 404 error page. But the messages do appear in the main category when I return to it. These problems do not occur in the main language, only in other languages. Therefore, when I am in the main language, messages appear under the subcategory and main category, but not in other languages, where they are displayed only in the main language.

+6
source share
1 answer

PLEASE CHECK THE UPDATE BELOW.

The solution to this problem is in your Apache configuration. You need to change the regular expression, which turns the paths into parameters for the WordPress index.php file.

WordPress is a very high-level system powered by PHP, which in itself is a very high-level system. WordPress does not have access to URLs as they arrive on the server. It only has an index.php file and it needs requests to access this file so that it can handle the request.

To make this possible, they use mod_rewrite, an Apache module that modifies requests before the server decides what to do with the request.

Check server error logs. You will see the real files that the server was trying to access. Also check out .htaccess WordPress files created in folders. In these files you will see regular expressions that mod_rewrite uses.

I checked your blog and it looks like you have already decided this. I still wanted to write so that others with the same problem could benefit. Especially after you noticed that your mention of another post in another place from two years ago has not been resolved.

UPDATE:

I am glad that I said that "I am almost sure ...": D (referring to the comments on this answer) It seems that things are slightly different from the situation that I decided several years ago.

I checked the WordPress code and did some testing. Initially, I thought that WordPress could not find the article because of / en / however I was wrong. The default behavior of WordPress to search for a message from a URL covers the situation as a positive side effect: let's say I don't have any plugins or any language, so /en/ means nothing to WordPress.

When I want to switch to erik.landvall.se/en/ , it returns 404 as expected. However, if we have a category structure like abc/cde/efg/ and an article like moo , which can be accessed in abc/cde/efg/moo ; when I change part of the link category, WordPress automatically redirects me to abc/cde/efg/moo :

en/abc/cde/efg/moo abc/efg/moo cde/efg/moo ...

all are redirected to abc/cde/efg/moo . I saw the same behavior on your blog except for en /, which brings your plugins to the scene. Now it’s obvious that the plugin handles the url structure differently than WordPress originally does or causes the original behavior to change in a different way.

I wanted to check the source of the plugin, as I promised; but I saw that it is impossible for me now, because it is a product that I must buy in order to see the source, and I do not want to buy something that I will never use :)

Since you said: "In the parent category, I still see the message and go to it without problems." I was thinking of 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 in our root folder:

 <?php function fix_lang_subcategory() { $p = trim($_SERVER['REDIRECT_URL'], '/'); if (substr_count($p, '/') > 2) { $_SERVER['REQUEST_URI']='/'.substr($p, 0, strpos($p,'/',4)).'/'.substr($p, strrpos($p, '/')+1).'/'.($_SERVER['QUERY_STRING'] ? '?'.$_SERVER['QUERY_STRING'] : ''); } }; fix_lang_subcategory(); require_once('index.php'); ?> 

After that, you should see the WordPress 404 file in / fix _lang_subcategory.php successfully. If this works, we can edit our .htaccess file.

At the end of your .htaccess file after

 # BEGIN WordPress <IfModule mod_rewrite.c> RewriteEngine On RewriteBase / RewriteRule ^index\.php$ - [L] 

add this line:

 RewriteRule ^en/ /fix_lang_subcategory.php [L] 

What we do here is that we change the entry point with our stupid php file from wordpress index.php so that we can run multiple php lines without touching the source. This only works for the / en / part of the site. Rest works the same as now. In our php file, we check if there is a connection with subcategories, and if so, we change (this is not very good!) REQUEST_URI, as shown below:

 /en/maincategory/subcategory1/subcategory2/article/?anything_here_untouched 

to

 /en/maincategory/article/?anything_here_untouched 

then we leave WordPress to work fine.

If the plugin works differently when you include subcategories, this may lead to redirecting the subcategory pages to / en /.

The best decision:

I thought you did not want to use subdomains for alternative languages; but then I saw: "Can you post the version of the translated blog in a subdirectory / subdomain?" according to the comments on your question and in your answer, it seems that the mention of the subdirectory caused a misunderstanding. Since I saw this on the ML plugin website, you can use a subdomain instead of a folder that will save you from all the problems, maybe:

Instead http://erik.landvall.se/en you can use http://en.erik.landvall.se/ ? May be?

Even better solution:

The 90% chance that ML Plugin is causing this, and they should fix it. Running a support ticket can help them realize their problem and fix it for everyone else.

+2
source

Source: https://habr.com/ru/post/915582/


All Articles