如何通过URL获取文章、页面、CPT及归档页面ID?
解决WPML中获取归档页面对应语言版本的问题
问题分析
url_to_postid() 和 get_page_by_path() 无法获取博客、商店这类归档页面的ID,核心原因是这类归档属于WordPress/WooCommerce的虚拟归档页面,并非实际的Post/Page类型内容,因此没有对应的Post ID,常规ID获取函数自然无法返回有效值。
解决方案
1. 处理博客归档页面
WordPress允许将普通页面设置为博客文章列表入口,这个页面有真实Post ID,可通过后台选项获取后用WPML转换:
// 获取博客归档绑定的页面ID $blog_page_id = get_option('page_for_posts'); // 转换为目标语言的页面ID($target_lang为目标语言代码,如'en'/'fr') $translated_blog_id = icl_object_id($blog_page_id, 'page', true, $target_lang); // 获取对应语言的博客归档URL $translated_blog_url = get_permalink($translated_blog_id);
2. 处理WooCommerce商店页面
商店页面同理,是后台设置的商品列表入口页面,可通过WooCommerce选项获取ID后转换:
// 获取商店页面的ID $shop_page_id = get_option('woocommerce_shop_page_id'); // 转换为目标语言的页面ID $translated_shop_id = icl_object_id($shop_page_id, 'page', true, $target_lang); // 获取对应语言的商店URL $translated_shop_url = get_permalink($translated_shop_id);
3. 通用归档URL转换(无需依赖ID)
如果不确定页面类型,或需处理自定义归档,可直接使用WPML内置函数直接转换URL:
// $target_lang为目标语言代码,直接传入原URL获取对应语言版本 $translated_archive_url = icl_get_translated_url($last_visited_url, $target_lang);
该函数会自动识别URL对应的内容类型(含各类归档),无需依赖Post ID即可返回对应语言的URL。
4. 自动判断URL所属归档类型
若需先判断URL对应哪种归档,可解析路径后匹配:
// 解析原URL获取路径部分 $parsed_url = parse_url($last_visited_url); $path = trim($parsed_url['path'], '/'); // 判断是否为博客归档 $blog_slug = get_post_field('post_name', get_option('page_for_posts')); if ($path === $blog_slug) { // 执行博客归档的转换逻辑 } // 判断是否为商店归档 $shop_slug = get_post_field('post_name', get_option('woocommerce_shop_page_id')); if ($path === $shop_slug) { // 执行商店归档的转换逻辑 }
内容的提问来源于stack exchange,提问作者Rajeev
相关产品推荐
相关产品推荐

