Wordpress短代码:参考DOM中的元素

问题描述 投票:0回答:1

我想创建一个短代码,在文档中搜索某个元素,该元素的DOM位置与短代码有明确的关系。

例:

<div>
  <div class="target" data-target="SomeValue">SomeValue<div>
  <div>more html here</div>
  <div>[gettarget]</div>
</div>

<div>
  <div class="target" data-target="SomeOtherValue">SomeOtherValue<div>
  <div>more html here</div>
  <div>[gettarget]</div>
</div>

函数gettarget如何访问其类target的兄弟div(将会有一个)并获取其内容(或其data-target属性,无关紧要)。所以最后我想要

  • gettarget第一次打电话给SomeValue
  • gettarget第二次打电话给SomeOtherValue

我能得到的最远的是:

$doc = new DOMDocument();
echo $_SERVER['SCRIPT_NAME'];
$doc->loadHTMLFile($_SERVER['SCRIPT_NAME']);
$xpath = new DOMXpath($doc);
var_dump($xpath);

产量:

/wp-admin/admin-ajax.phpobject(DOMXPath)#11113 (1) { ["document"]=> string(22) "(object value omitted)" }

那不是我的文件: - /

php wordpress dom shortcode
1个回答
1
投票

正如我在评论中所说

- 函数gettarget如何访问其类目标的sibling-div? - 它无法在wordpress中调用[您的短代码]时页面尚未完成。更多只有开放和关闭的短代码[start]content[/start]中的内容被传递给短代码,没有外部内容是可访问的(不使用javascript)

您可以使用像add_filter( 'the_content', 'filter_function_name' )这样的过滤器,一个正则表达式/\[gettarget\]/,以及一些不是短代码[gettarget]的东西,因为如果它们不是实际的短代码,WP会将它们留在中。然后,当您拥有完整的内容时,您可以在DOM中访问您想要的内容。等等

它看起来像任何一个好的答案,所以......

像这样的东西:

add_filter( 'the_content', 'filter_function_name' );

function filter_function_name($content){
    //if no [gettarget] bail
    if(false === strpos($content,'[gettarget]')) return $content;


    $doc = DOMDocument::loadHTML($content);
    $xpath = new DOMXpath($doc);
    var_dump($xpath);

    //for example remove [gettarget] our not shortcode, shortcode
    $content = preg_replace('/\[gettarget\]/', '', $content);

    return $content;
}

我曾经只使用过一次Dom Document,(然后我学会了PHPQuery,再也没有看过它)。但是这样你不会加载页面,我真的不确定你从wordpress内部从这个$doc->loadHTMLFile($_SERVER['SCRIPT_NAME'])得到什么。也许只是一个模板文件或类似的?

我上面的方式,我知道content是wordpress将在页面上推出的。更不用说我不知道​​你将如何从你的方式改变输出。这样您就可以修改内容并将其返回并进行更改。

- 注意 - 最后一件事,它已经过了一分钟但是如果我记得你有类似短代码[gettarget]的东西,但你实际上没有它的短代码,它只是留在内容中。如果这是正确的,那么我上面所说的应该非常接近。我们可以利用这个优势,使它看起来像是WP管理区域内的短代码,并且在输出中(通过删除它)。

我想过用JavaScript做这件事,但唉,我懒得把它放进去......

无论如何希望它有所帮助。

© www.soinside.com 2019 - 2024. All rights reserved.