向``元素添加ID的多种方法

Avatar of Trishah Woolley
Trishah Woolley 发表于

DigitalOcean 为您旅程的每个阶段提供云产品。立即开始使用 200 美元的免费额度!

以下是由 Trishah Woolley 撰写的一篇客座文章。多年来,Trishah 收集了大量代码片段,这些代码片段可以根据一些可变信息(如 URL 或来自 WordPress 的数据)添加 ID 和类。这些代码片段中的每一个要么是从文档或类似的在线资源中收集的,要么是 Trishah 根据所涉及语言和 API 的标准功能编写的。

在我从事 WordPress 网站设计期间,有时需要向<body>标签添加 ID 或类。例如:当将第三方软件集成到 WordPress 中时,通常会发生这种情况,这些软件会创建 WordPress 无法识别的页面。或者我需要为我正在创建的网站设计创建更细致的类。

为了以某种方式更改这些页面的外观,使样式仅应用于该页面,我们需要一种方法来仅定位该页面或页面类别。下面是我发现的一些对向非 WordPress(但仍然是 PHP)和 WordPress 页面的<body>添加 ID 和类有帮助的方法。

PHP 变体

#01 – 从 URL 添加 ID

这将从 URL 中去除正斜杠、`.php` 和 `?pg=`,并使用其余部分作为 ID。更改数组以匹配您的特定情况。

<?php
  $page = str_replace(array('/', '.php', '?pg='), '', $_SERVER['REQUEST_URI']);
  $page = $page ? $page : 'default';

  /* Sanitize $page! */

?>

<body id="<?php echo $page ?>">

示例

http://domain.com/directory/test.php?pg=12345

变为

<body id="directorytest12345">

#02 – 从 URL 添加 ID 和类

这将在 URL 中查找 `?`,并将它之前的内容转换为 ID,并将它之后的内容转换为类。

<?php
  list($page, $class) = explode('?', $_SERVER['REQUEST_URI']);
  $page = str_replace(array('/', '.php'), '', $page);
  $class = str_replace(array('='), '', $class);
  /* Sanitize $page and $class! */
?>

<body id="<?php echo $page ?>" class="<?php echo $class ?>">

示例

http://domain.com/directory/test/?pg=12345

变为

<body id="directorytest" class="12345">

#03 – 从文件名添加 ID

这将删除 `.php` 并使用文件名作为 ID

<body id="<?=basename($_SERVER['PHP_SELF'],'.php')?>">

示例

http://domain.com/directory/test.php

变为

<body id="test">

#04 – 从一级目录添加 ID

这将获取一级目录并将其用作 ID。

$url = explode('/', $_SERVER['REQUEST_URI']);
  $dir = $url[1] ? $url[1] : 'home';
?>

<body id="<?php echo $dir ?>">

示例

http://domain.com/directory1/directory2/test.php

变为

<body id="directory1">

WordPress 变体

WordPress 具有一个用于将类应用于 body 的原生函数

<body <?php body_class(); ?>>

根据您所在的页面,这将产生如下输出

<body class="single single-post postid-245501 single-format-standard">

但是您仍然可以做更多事情,例如将其与上述技术结合起来并添加您自己的类。

#05 – WordPress:向默认 body 类添加类

使用以下方法向 WordPress 生成的类添加您自己的类

<body <?php body_class('class-one ); ?>>

变为

<body class="page page-id-2 page-parent page-template-default logged-in class-one">

#06 – WordPress:向默认 body 类添加多个类

您可以像这样添加多个类

<?php body_class(array("class-one", "class-two", "class-three")); ?>

变为

<body class="page page-id-2 page-parent page-template-default logged-in class-one class-two class-three">

#07 – WordPress:向 body 标签添加 ID 和类

这可能是我最喜欢的!它与上面的功能相同,但将新类添加到 WordPress 的body_class

list($page, $class) = explode('?', $_SERVER['REQUEST_URI']);
$page = str_replace(array('/', '.php'), '', $page);
$class = str_replace(array('='), '', $class);
?>

<body id="<?php echo $page ?>" <?php if (function_exists('body_class')) body_class($class ); ?>>

示例

http://domain.com/directory/test/?pg=12345

变为

<body id="directorytest" and class="page page-id-2 page-parent page-template-default logged-in 12345">

#08 – WordPress:使用 Slug

<body id="<?php echo $post->post_name; ?>">

示例

http://domain.com/category1/slug/

变为

<body id="slug">

#09 – WordPress:有条件地添加额外的类

这使用条件if()逻辑向 WordPress 生成的类添加 body 类。例如,这里我们使用 WooCommerce 提供的is_shop()布尔逻辑

<body <?php if (is_shop()) { body_class('shop'); } else { body_class(); } ?>>

变为

<body class="page page-id-2 page-parent page-template-default logged-in shop">

#10 – WordPress:将 Slug 添加到 Body 类默认值

我们还可以通过过滤来更改body_class()函数的输出。我们可以在 `functions.php` 或我们自己的功能插件中执行此操作。

这里我们将添加 Slug

function add_slug_body_class( $classes ) {
global $post;
  if (isset($post)) {
    $classes[] = $post->post_type . '-' . $post->post_name;
  }
  return $classes;
}
add_filter('body_class', 'add_slug_body_class');

示例

http://domain.com/category/page-slug/

变为

<body class="page page-id-2 page-parent page-template-default logged-in page-slug">

#11 – WordPress:使用 function.php 过滤器添加到 Body 类

将以下内容添加到 functions.php 中

function my_body_classes( $classes ) {
  $classes[] = 'class1';
  return $classes;
}
add_filter('body_class', 'my_body_classes');

然后它将输出如下,只需直接调用body_class(),无需执行任何其他操作

<body class="page page-id-2 page-parent page-template-default logged-in my_body_classes">

#12 – WordPress:使用 Functions.php 对函数进行原始过滤

这是添加任何名称的单个类的方法

function my_body_classes( $classes ) {
  $classes[] = 'class1';
  return $classes;
}
add_filter('body_class', 'my_body_classes');

变为

<body class="page page-id-2 page-parent page-template-default logged-in class1">

在非商店页面上,它会变成这样

function my_body_classes( $classes ) {
  $classes[] = 'class1';
  if (is_shop()) {
    $classes[] = 'shop';
  }
  return $classes;
}
add_filter('body_class', 'my_body_classes');

在非商店页面上,它会变成这样

<body class="page page-id-2 page-parent page-template-default logged-in class1">

如果逻辑结果为true(例如,在商店页面上),则会变成这样

<body class="page page-id-2 page-parent page-template-default logged-in class1 shop">

#14 WordPress:使用 functions.php 删除默认输出中的类

通过此方法,您可以从body_class()中删除类。

function adjust_body_class($classes) {
  foreach ($classes as $key => $value) {
    if ($value == 'class-to-remove') unset($classes[$key]);
  }
  return $classes;
}
add_filter('body_class', 'adjust_body_class');

如果我们从这里开始

<body class="page page-id-2 page-parent page-template-default logged-in">

并删除了“page-parent”,我们将得到以下结果

<body class="page page-id-2 page-template-default logged-in">

#15 WordPress:添加分类

将分类添加到body_class()

function add_category_name($classes = '') {
  if (is_single()) {
    $category = get_the_category();
    $classes[] = 'category-'.$category[0]->slug;
  }
  return $classes;
}
add_filter('body_class','add_category_name');

示例 URL

http://domain.com/category1/post-title/ 

变为

<body class="page page-id-2 page-parent page-template-default logged-in category1">

#16 WordPress:通过 functions.php 过滤器添加分类

您也可以通过过滤器来实现。

function add_category_to_single($classes) {
  if (is_single()) {
    global $post;
    foreach((get_the_category($post->ID)) as $category) {
      // add category slug to the $classes array
      $classes[] = $category->category_nicename;
    }
  }
  // return the $classes array
  return $classes;
}
add_filter('body_class', 'add_category_to_single');

示例 URL

http://domain.com/category1/post-title/ 

变为

<body class="page page-id-2 page-parent page-template-default logged-in category1">

#17 WordPress:添加浏览器类名

WordPress 提供了一些全局变量,包括关于正在使用什么浏览器的布尔值。您也可以将这些添加到 body 类中。

function browser_body_class($classes) {
  global $is_lynx, $is_gecko, $is_IE, $is_opera, $is_NS4, $is_safari, $is_chrome, $is_iphone;

  if ($is_lynx) $classes[] = 'lynx';
  elseif ($is_gecko) $classes[] = 'gecko';
  elseif ($is_opera) $classes[] = 'opera';
  elseif ($is_NS4) $classes[] = 'ns4';
  elseif ($is_safari) $classes[] = 'safari';
  elseif ($is_chrome) $classes[] = 'chrome';
  elseif ($is_IE) $classes[] = 'ie';
  else $classes[] = 'unknown';

  if ($is_iphone) $classes[] = 'iphone';
  return $classes;
}
add_filter('body_class', 'browser_body_class');

Chrome 示例

<body class="page page-id-2 page-parent page-template-default logged-in chrome">

小心不要依赖这些功能来实现重要的功能!像这样使用用户代理测试,已知会导致比它解决的问题更多的麻烦。