Polylang的滤波器滤波器前页面
#网络开发人员 #php #wordpress

您是否曾经使用polylang在循环中尝试过类似WP_Post::get_option()->is_front_page()?不,那不是正确的语法,但这是我在提出工作解决方案之前尝试和搜索过的。

让我向您展示我的最初要求,不同的方法以及它们不起作用的原因。但是您也可以使用内容表中的链接直接跳到解决方案。

目录

要求:多种编辑,多种语言

要求:我想提供WordPress块编辑器以编辑页面,除非它是首页。 (首页具有使用自定义字段和帖子类型的自定义设计和内容。)

附加要求:有多种语言,因此不止一个,因此我们不能简单地将当前帖子的ID与后端的get_option( 'page_on_front' ))进行比较。

有条件阻止块编辑器

您可能还发现了一些像this one这样的问题,证明我不是第一个,也不是唯一要问的问题。

我正在创建一个新的WordPress主题,并希望在首页上专门使用经典编辑器。为此,我计划使用几行代码来修改function.php文件,而不是依靠插件。

我想维护古腾堡编辑

根据邮政类型,使用Gutenberg Block编辑器

基于帖子或页面类型,我们可以在functions.php中添加过滤器

/* use block editor only for page type "page" */
add_filter('use_block_editor_for_post_type', function (
  $useBlockEditorForPost,
  $post
){
  if ($post->post_type === 'post') return false;
  if ($post->post_type === 'story') return false;
  return $useBlockEditorForPost;
},
  /** @var int $priority */ 10,
  /** @var int $accepted_args */2
);

不包括主页或首页?

主页与头版

默认的WordPress主页是显示最新博客文章的页面。我们可以配置我们的网站以显示静态WordPress页面,而这也可以成为主页。我们还可以提供一个称为front-page.php的自定义HTML模板(根据WordPress“ codex”手册中的template hierarchy)。

但是,我们应该使用is_home()is_front_page()检查页面是主页,还是在我的情况下是正确的最佳实践,以扩展我的过滤器功能并在编辑主页时关闭块编辑器。

有一个称为use_block_editor_for_post的更通用的过滤器,不限于邮政类型。另外很容易找到:is_home()is_front_page()在循环中不适用于当前帖子,至少不是不提供发布ID的情况。没有抬头,我会尝试$post->is_front_page()is_front_page($post->ID)?所以让我们看看...

add_filter('use_block_editor_for_post_type', function (
  $useBlockEditorForPost,
  $post
){
  if ($post->post_type === 'post') return false;
  if ($post->post_type === 'story') return false;
  if (is_front_page($post->ID)) return false;

哦,好吧,好吧,在尝试并阅读了大约10或20个关于stackexchange的晦涩的问答讨论之后,我找到了另一种方法:

get_option('page_on_front')

  if ($post->ID && 
      $post->post_ID > 0 && 
      $post->ID === (int) get_option( 'page_on_front' )
     ) return false;

即使有效,在管理页面上使用时应该如何返回一个以上的发布ID?记住我的要求:在本地化的多语言场景中,我的前页面和语言都尽可能多。

循环与当前查询

许多内置的WordPress核心功能,例如is_home()is_front_page()假设我们要检查当前帖子的(或页面)属性,在全局上下文或循环内部隐式可用(或者在调用the_post之后)称为。有一些“典型”的getter函数对,例如the_title()get_the_title($post_ID),前者在当前的帖子标题上打印为STDOUT的标题,而后者只有后者接受可选的ID,并且可以分配给一个变量,但是许多Boolean内置的内置都没有官方的对方接受ID并可以在自定义循环中使用。

结论:如何检查当前页面(内部多语言循环)是否是WordPress中的首页

或从技术上讲,说话,如何用polylang循环中的属性is_front_page()过滤WP_Post,或者,正如我们将看到的,在不使用is_front_page()的情况下如何执行此操作。

基于another StackOverflow answer,我们可以迭代所有语言,并将每个本地的头版与当前页面进行比较。

天真,务实且对性能的粗心(至少在后端,或者被缓存)

天真而务实的,我知道我的网站上只有两种语言,所以让我们从硬编码的数组开始,专注于新功能,找出是否有效。

我什至不在乎性能,因为它在管理员后端,如果不是,我也不在乎静态HTML网页从缓存中快速迅速,除非我们实际上需要无法登录用户的个性化数据(例如个性化数据)。

获取WordPress + Polylang中选定语言网站的主页

在我的WordPress + Polylang网站上,accueil是法语中的主页名称,inicio是西班牙语中的主页名称。

主页是:

English : https://www.example.com
French  : https://www.example.com/fr/accueil/
Spanish : https://www.example.com/es/inicio/

是否可以获取选定语言的首页URL?

从接受的答案中复制代码时,我已经感觉到我不过是中途的,因为它并未称为pll_home_page,而是pll_home_url。让我们回荡值,看看要从那里去哪里。

// (string) pll_home_url(  $lang = '' );
echo 'home url en: ' . pll_home_url( 'en' );
echo 'home url de: ' . pll_home_url( 'de' );

如果我们不在过滤器功能中的return false,Gutenberg的JavaScript Spa将隐藏我们的回声消息,但是在检查页面源时,我们仍然可以找到它:

Image description

这里是:

home url en: http://bs-local.com:1234/homepage/
home url de: http://localhost:1234/

这看起来有些意外,但这是正确的。由于德语('de')已设置为默认语言,而我的永久链接设置省略了其他任何内容,但英语首页URL不包含ab /en/ slug。

因此,我们可以将当前页面的URL(或从技术上讲,the current post's permalink)与已知的语言变化进行比较吗?

  echo ' ;post permalink: ' . get_permalink($post->ID);

及其匹配时,返回false以禁用块编辑器。

  $languages = array( 'de', 'en' );
  foreach ($languages as &$language) {
    if (get_permalink($post->ID) == pll_home_url($language)) 
      return false;
  }

最后,让我们使用实际语言,以便当网站所有者想要添加第三语言时,我们的主题仍然有效。我们可以使用Polylang的koude29函数。

最终过滤器功能:use_block_editor_for_post

这是我的最终functions.php滤波器功能,可在任何语言和帖子和我的自定义帖子类型以外的首页启用块编辑器启用:
除外:

add_filter('use_block_editor_for_post', function (
  /** @var bool */ $useBlockEditorForPost,
  /** @var WP_Post */ $post
){
  if ($post->post_type === 'post') return false;
  if ($post->post_type === 'story') return false;
  $languages = pll_languages_list();
  foreach ($languages as &$language) {
    if (get_permalink($post->ID) == pll_home_url($language))
      return false;
  }
  return $useBlockEditorForPost;
},
  /** @var int $priority */ 10,
  /** @var int $accepted_args */2
);

这将阻止前页面的块编辑器,但我们仍然可以在任何其他页面上使用它。

自定义经典编辑的样式和工具栏

我们还可以自定义Classic(tinyMce)编辑器,添加编辑器样式(add_editor_styleadmin_init动作中)和类名称(在Javasript:acf.add_filter( 'wysiwyg_tinymce_settings'中),并自定义经典编辑器工具栏(in PHP:add_filter('acf/fields/wysiwyg/toolbars'),以使其变得容易。对于网站所有者使用混合WordPress主题(经典 +块编辑,我在2023年classic themes with block patterns in WordPress的较早文章中)时,可以安全地编辑其网站内容。