Wordpress шорткод: ссылка на элемент в DOM - PullRequest
0 голосов
/ 02 марта 2019

Я хочу создать шорткод, который ищет в документе определенный элемент, чья 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 может получить доступ к своему дочернему элементу div класса target (будет ровно один) и извлечь его содержимое (или его data-target -атрибут, не имеет значения).Итак, наконец, я хочу, чтобы

  • 1-й вызов gettarget имел доступ к SomeValue и
  • 2-й вызов 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)" }

Это не мой документ: - /

1 Ответ

0 голосов
/ 02 марта 2019

Как я уже сказал в комментариях

-Как функция gettarget может получить доступ к своему брату-члену класса target? - Не может, в WordPress страница не имеетбыло завершено, когда вызывается [ваш шорткод].Кроме того, только более короткий контент в открытом и закрытом шорткоде [start]content[/start] передается в шорткод, ни один из внешнего контента не доступен (без использования javascript)

Вы можете использовать фильтр, такой как add_filter( 'the_content', 'filter_function_name' ) aрегулярное выражение /\[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 и больше никогда не смотрел на него).Но, таким образом, вы не удваиваете загрузку страницы, я действительно не уверен, что вы получаете от этого $doc->loadHTMLFile($_SERVER['SCRIPT_NAME']) изнутри WordPress.Может быть, просто файл шаблона или что-то в этом роде?

Как я уже сказал выше, я знаю, что content - это то, что WordPress собирается выложить на странице.Не говоря уже о том, что я понятия не имею, как бы вы внесли какие-либо изменения в вывод по сравнению с тем, как это было у вас.Таким образом, вы можете просто изменить содержимое и вернуть его, и оно будет изменено.

-note- Еще одна вещь, это была минута, но если я помню, если у вас есть что-то вроде шорткода [gettarget], но вы неу него фактически есть шорткод, он просто остается в контенте.Если это правильно, то, что я сказал выше, должно быть довольно близко.Мы можем использовать это в наших интересах и сделать так, чтобы это выглядело как шорткод внутри административной области WP и в выводе (удаляя его).

Я думал сделать это с помощью JavaScript, но, увы,лень вкладывать столько в это ...

В любом случае надеюсь, что это поможет.

...