Wordpress 简码:参考 DOM 中的元素

Wordpress shortcode: Refer to element in DOM

我想创建一个简码,用于在文档中搜索某个元素,该元素的 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 如何访问它的 class target 的兄弟-div(正好有一个)并获取它的内容(或者它的 data-target-属性,无所谓)。所以最后我要

我能到达的最远距离是:

$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)" }

那不是我的文件:-/

正如我在评论中所说

-How can the function gettarget access its sibling-div of class target?- It cant, in wordpress the page hasn't been completed when [your shortcode] is called. Further more only content within an open and close shortcode [start]content[/start] is passed to the shortcode, none of the outer content is accessable (without the use of javascript)

You could use a filter such as add_filter( 'the_content', 'filter_function_name' ) a regular Expression /\[gettarget\]/, and something that is not a short code [gettarget] as WP leaves them in if they are not actual shortcodes. And then as you have the full content in your hands, you can access what you want in the DOM. etc. etc

这似乎是一个很好的答案,所以...

像这样:

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 将要在页面上显示的内容。更不用说我不知道​​您将如何根据您的方式进行任何输出更改。这样你就可以修改内容,return它就改变了。

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

我想用JavaScript来做,可惜我懒得放那么多了...

总之希望对您有所帮助。