使用PHP在任意数量的元素中使用包装元素

时间:2017-02-21 作者:sheriffderek

我正在处理WordPress子主题,在该主题中,除了标题之外,我无权访问任何标记。php。(我可以访问child functions.php和style.css)

该站点有一个body和一个div#包装器,但我真的希望它们之间有1到2个div,因为我不想使用body来创建列,目前,唯一解决古怪标记的方法是使用body。在这种情况下,我想得到一个实际包装页面内容的div。

<html>
  <body>
   <section class=\'NEW-WRAPPING-ELEMENT\'>
     <div id=\'wrapper\'>
       ...
     </div>
     <div id="footer\'></div>
     <div id="other\'></div>
   </section>
  </body>
</html>
在大多数情况下,这种标记在经典的960px绝对定位布局中可能工作得很好,但当您想要一个可扩展的响应性布局时,很难使用它。

我可以使用JavaScript并在页面加载时包装它们,但似乎最好在服务器上构建它,因为我使用的是PHP。此外,您还可以看到当。主包装器启动。不好!

我正在删除p 来自图像的标记和使用figure 具有preg_wrap. 我是否可以使用类似的技术用另一个div“包装”我的所有东西?我根本不懂正则表达式。我一起破解了这个,但还没有到目前为止。想法???

function wrap_wrapper( $content ) {
    // A regular expression of what to look for.
    $pattern = \'/<body>(.*?)<\\/body>/i\';
    // What to replace it with. $1 refers to the content in the first \'capture group\', in parentheses above
    $replacement = \'<section class="new-master">$1</section>\';
    return preg_replace( $pattern, $replacement, $content );
}
add_filter( \'the_content\', \'wrap_wrapper\' );
Here is a CodePen 使用我必须使用的完整标记示例:

2 个回复
最合适的回答,由SO网友:Nathan Johnson 整理而成

我可以用类似的技巧用另一个div“包装”我的所有东西吗?

绝对地几乎一切皆有可能。但你必须做一些有点粗俗的事。

这个the_content 过滤器实际上不会过滤整个页面的内容。这种特殊的过滤器在整个WordPress中被用来过滤各种不同的内容。

不幸的是,没有一种好方法可以过滤整个页面。

实现这一点的一种方法是使用ob_start()ob_get_clean() 连接到适当的挂钩上。在将任何内容输出到页面之前,我们需要挂接并启动输出缓冲区。然后,我们需要在最后一个可能的时刻,抓住缓冲区。

然后我们可以对内容做些什么。你的正则表达式很接近,但不完全正确。

在您的功能中。php,添加以下内容:

//* Hook into WordPress immediately before it starts output
add_action( \'wp_head\', \'wpse_wp\', -1 );
function wpse_wp() {

  //* Start out buffering
  ob_start();

  //* Add action to get the buffer on shutdown
  add_action( \'shutdown\', \'wpse_shutdown\', -1 );
}

function wpse_shutdown() {

  //* Get the output buffer
  $content = ob_get_clean();

  //* Do something useful with the buffer

  //* Use preg_replace to add a <section> wrapper inside the <body> tag
  $pattern = "/<body(.*?)>(.*?)<\\/body>/is";
  $replacement = \'<body$1><section class="new-master">$2</section></body>\';

  //* Print the content to the screen
  print( preg_replace( $pattern, $replacement, $content ) );
}
我是否应该使用类似的技巧,用另一个div“包装”我的所有东西?

视情况而定。更好、更快的方法是编辑模板文件。既然您声明您没有访问模板文件的权限,那么我相信这样的东西将是您唯一的选择。

SO网友:scott

你说,

除了样式表和标题之外,我没有其他访问权限。php。

。。。但你没有说明原因。在我看来,要想让儿童主题很好地发挥作用,你至少需要functions.php 如果不是内容模板。如果你不能访问或创建这些,我会对你的客户说,“这是你的烂网站。这是你给我的工具所能做的最好的。如果你允许访问更多的文件,我会做得更好。”

这是我的第一个想法。我的第二个想法是,如果你需要的所有修改都在标题中,那么你的计划似乎可以奏效。

我最后的想法更像是一个疑问:你能创建一个插件来接管你无法访问的主题文件吗?

相关推荐

GET_SHORTCODE_regex()只与第一个短码匹配

法典中有an example 使用get\\u shortcode\\u regex()检查是否在给定页面上调用了短代码:$pattern = get_shortcode_regex(); preg_match(\'/\'.$pattern.\'/s\', $posts[0]->post_content, $matches); if (is_array($matches) && $matches[2] == \'YOURSHORTCODE\') { /