【问题标题】:Wordpress shortcode: Refer to element in DOMWordpress 简码:引用 DOM 中的元素
【发布时间】:2019-07-24 01:59:37
【问题描述】:

我想创建一个简码,在文档中搜索某个元素,该元素的 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)" }

那不是我的文件:-/

【问题讨论】:

  • How can the function gettarget access its sibling-div of class target 不能,在wordpress中调用do_shortcode时页面还没有完成。此外,只有打开和关闭简码 [start]content[/start] 中的内容被传递给简码,外部内容均不可访问(不使用 javascript)。
  • 您可以使用过滤器,例如add_filter( 'the_content', 'filter_function_name' ) 正则表达式/\[gettarget\]/,以及不是短代码[gettarget] 的东西,因为如果它们不是实际的短代码,WP 会将它们留在里面。然后,当您拥有完整的内容时,您可以在 DOM 中访问您想要的内容。等等等等。
  • 你想用这些值做什么?因为您可以将一个 JS 文件排入队列,该文件很容易将它们抓取到准备好的文档中。
  • @Second2None - 感谢您的补充,这就是我在第一条评论中提到的(without the use of javascript) 的意思。但你说得更好...... :)

标签: php wordpress dom shortcode


【解决方案1】:

正如我在 cmets 中所说的

-gettarget 函数如何访问其类目标的同级 div?- 它不能,在 wordpress 中,调用 [your shortcode] 时页面尚未完成。此外,只有打开和关闭短代码 [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-&gt;loadHTMLFile($_SERVER['SCRIPT_NAME']) 得到什么。也许只是一个模板文件之类的?

按照我上面的方式,我知道 content 是 wordpress 将在页面上发布的内容。更不用说我不知道​​你会如何改变你的输出方式。这样你就可以修改内容并返回它,它已经改变了。

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

我想过用 JavaScript 来做这件事,可惜我懒得在里面放这么多……

希望对你有帮助。

【讨论】:

    猜你喜欢
    • 2022-01-01
    • 2021-09-16
    • 1970-01-01
    • 2017-05-13
    • 1970-01-01
    • 2011-06-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多