【问题标题】:Manipulate slugs and urls on wordpress在 wordpress 上操作 slug 和 url
【发布时间】:2018-09-28 21:05:44
【问题描述】:

有没有办法在 wordpress 上创建“虚拟”slug?

例如: 我创建了一个名为“year”的自定义帖子类型,并且 slug 是 /year/。创建此自定义帖子类型仅用于生成 slugs(/year/)。我在此自定义帖子类型中没有任何帖子。

我想输入 url /year/1988/ 并且 Wordpress 调用 single.php 文件。 如果我今天这样做,wordpress 将返回 404,因为 1988 需要是自定义帖子类型(年份)内的帖子。

我需要一些 .php 代码或 .htaccess 来执行以下操作:如果在 /year/ 之后键入某些内容,它会加载单个文件,因为我无法为每年 1901、1902、1903 ... 和我将获取此信息并进行必要的查询。

【问题讨论】:

  • "我想输入 url /year/1988/ 并且 Wordpress 调用 single.php 文件。" > single.php 究竟要显示什么?
  • 目前还不清楚您要做什么。请详细说明,否则我们无法为您提供帮助。
  • @Michael single.php 文件是显示帖子内容的模板。我在 /year/ 之类的 (1988, 1987...) 中没有任何帖子,但我在其他帖子中有年份信息。在 single.php 上,我有一个 sql 查询,它返回 post 并使用诸如 year 之类的信息来过滤它。我想访问 /year/1988/ 并点击 single.php 文件而不是 404 来过滤帖子字段中所有 1988 的帖子
  • 我只是觉得您使用 Wordpress 的方式并没有按照应有的方式使用。 single.php 上的自定义 SQL 查询,仅为 slug 创建 CPT - 如果您编写自己的逻辑可能会更好?您是否尝试过添加自定义rewrite endpoint。您的端点是year,查询变量是ie。 1988。您可以使用get_query_var 获取查询变量。然后在你的 single.php 上做一个模板重定向。
  • @Michael 对此感到抱歉,但我正在使用带有 acf 的 wordpress。我只使用 SQL 查询而不是 wp-query 是因为我在 post 中有大约 10 个自定义字段(每个字段都是一个 cpt),并且 wp-query 发出很多请求/查询以仅列出一个信息

标签: php wordpress .htaccess


【解决方案1】:

如果您需要此功能仅在您的主页上工作(即mysite.org/years/1988),您可以添加自定义重写标记和规则:

add_filter( 'init', function() {

     add_rewrite_tag( '%years%', '([^&]+)' );

     // Match the front page and pass years value as a query var.
     add_rewrite_rule( '^years/([^/]*)/?', 'index.php?years=$matches[1]', 'top' );

});

然后使用新的查询变量加载不同的模板:

add_filter( 'template_include', function( $template ) {

 if ( get_query_var( 'years' ) ) {

   $new_template = locate_template( array( 'single.php' ) );
   if ( !empty( $new_template ) ) {
       return $new_template;
   }
 }
 return $template;

});

我尝试使用year,但它不起作用,我认为这是 Wordpress 使用的保留查询变量。别忘了冲马桶,我的意思是重写规则;)。

【讨论】:

  • 对不起,名字是years,因为year是保留的。代码不起作用。其他正在工作的 cpt 停止并显示此消息样式表丢失。如果我尝试访问 /years/1988 它会返回 404
  • 我更新了我的答案。这现在仅可以在您的首页/主页上使用。
  • 是的,我脸红了。整个网站恢复正常,但 /year/number 返回 404
  • 我在本地机器上运行了这段代码,它可以工作。如果您的 homepage/years/1988 仍然出现 404,那么您的代码/安装还有另一个问题。
  • 你刷新重写只保存还是在functions.php中?这是我要你检查是否有必要添加一些东西的过程; <IfModule mod_rewrite.c> RewriteEngine On RewriteBase /project-x/www/wordpress/ RewriteRule ^index\.php$ - [L] RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule . index.php [L] </IfModule>
猜你喜欢
  • 2018-03-20
  • 2020-04-24
  • 2018-11-15
  • 2021-05-19
  • 2021-09-17
  • 1970-01-01
  • 2019-03-15
  • 2014-10-03
  • 2012-09-01
相关资源
最近更新 更多