Может ли шорткод получить HTML/текст из контента и вернуть его дважды с добавленным HTML?

21 мая 2016 г., 03:44:05
Просмотры: 1.34K
Голосов: 2

Я пытаюсь упростить себе работу и надеюсь, что кто-то знает, возможно ли это.

Это изображения, настроенные в слайдере, который показывает текстовое наложение на изображение на следующем слайде в многостраничной записи.

Вот что я пытаюсь сделать. Взять это:

<h2>Заголовок изображения</h2>
[caption]<img src="http">[/caption]
текст для слайда

И вывести их вот так:

<div class="singe_slide">
<h2>Заголовок изображения</h2>
[caption]<img src="http">[/caption]
</div>
<!--nextpage-->
<div class="singe_slide">
<h2>Заголовок изображения</h2>  //То же изображение на следующей странице
[caption]<img src="http">[/caption]
<div class="slide_caption"><div class="captExt">
текст для слайда
</div></div>
<!--nextpage-->

Вот что я сейчас использую для своих шорткодов, но это занимает столько же времени, как и ручное добавление div'ов, и выглядит очень грязно. Это выглядит так:

[Slide]<h2>Заголовок изображения</h2>
[caption]<img src="http">[/caption][/Slide]
<!--nextpage-->
[Slide]<h2>Заголовок изображения</h2> //То же изображение на следующей странице
[caption]<img src="http">[/caption]
[SlideCap]текст для слайда[/SlideCap][/Slide]
<!--nextpage-->

А вот мои два шорткода:

function Slide($atts, $content = null) {
    $content = wpautop(trim($content));
    return '<div class="singe_slide">' . do_shortcode($content) . '</div>';
}
add_shortcode('Slide', 'Slide');

function SlideCap($atts, $content = null) {
    $content = wpautop(trim($content));
   return '<div class="slide_caption"><div class="captExt">' . do_shortcode($content) . '</div></div>';
}
add_shortcode('SlideCap', 'SlideCap');

Я открыт для предложений по более простому способу сделать это. Это мой самый первый шорткод, так что я новичок в этом.

Возможно ли получить что-то между шорткодами как переменную? [shortcode]Эта часть здесь[/shortcode]

8
Комментарии

Кажется, я не совсем понимаю. Второй аргумент в вашем обработчике шорткода - $content - будет получать содержимое, которое находится между вашими шорткодами. Это то, что вы имеете в виду? Я не уверен, зачем вы снова пропускаете это через do_shortcode()...

Tim Malone Tim Malone
21 мая 2016 г. 04:47:14

@TimMalone Я добавил больше информации в пост, что может помочь. Во-первых, я не PHP-программист, поэтому многое делается методом проб и ошибок. Я запускаю его дважды, потому что у меня шорткод внутри шорткода, и я не знаю, как сделать это по-другому. Я добавил, как сейчас пишу свой шорткод при создании поста в WP. Я пытаюсь вернуть заголовок и изображение дважды с разделителем nextpage между ними и текст один раз на второй странице, всё обёрнутое в div'ы.

DRK DRK
21 мая 2016 г. 15:00:55

Что неясно в вашем вопросе - какой HTML-вывод вы пытаетесь получить. Вы поделились множеством кода, но не сказали: "У меня есть этот шорткод X, и я хочу, чтобы он выдавал этот HTML Y. Этот код Z - то, что я пытаюсь использовать для этого, но вместо этого получается W. Почему так?"

ToniWidmo ToniWidmo
21 мая 2016 г. 16:03:39

@AntonChanning Простите, я не программист. Я описал, что пытаюсь достичь и что сейчас делаю для этого. Проблема в том, что добавлять все шорткоды и заголовки/изображения дважды очень утомительно. Это отнимает столько же времени, как если бы я вставлял HTML вручную вместо шорткодов. Я хочу сделать так, чтобы мой шорткод принимал $content и выводил его так, как мне нужно. По сути, объединив мои шорткоды в один. Я просто не знаю, как получить каждый нужный элемент между шорткодами и вывести его нужным образом. Мне нужно сначала разбить его на массив?

DRK DRK
21 мая 2016 г. 16:42:11

Сейчас над этим работает программист. Если у него получится, я выложу его решение.

DRK DRK
21 мая 2016 г. 17:37:15

Так ты пытаешься использовать шорткод для создания изображения с подписью?

ToniWidmo ToniWidmo
21 мая 2016 г. 17:43:42

Вы ищете что-то вроде [slide=http://image.url]<h2>Заголовок изображения</h2>[slidecap]Это подпись.[/slidecap][/slide]?

ToniWidmo ToniWidmo
21 мая 2016 г. 18:09:47

@AntonChanning Извините, если я вас запутал. Подпись берется из WordPress, не путайте её с шорткодом SlideCap. Подпись вставляется автоматически, когда я добавляю её в поле подписи для изображения, где указываю авторство. SlideCap — это непрозрачная накладка на изображении с текстом, описывающим изображение. Если я использую [slide=http://image.url], это создаст ещё больше шагов. Я пытаюсь взять заголовок h2, изображение с подписью или без, и текст поста, затем разместить заголовок h2 и изображение на одной странице, а заголовок h2, изображение и текст поста — на следующей.

DRK DRK
21 мая 2016 г. 18:17:26
Показать остальные 3 комментариев
Все ответы на вопрос 1
1

Хорошо, я думаю, я понял, о чем вы на самом деле спрашиваете. Вы спрашиваете, какая переменная отвечает за содержимое между шорткодами. Если это все, что вас интересует, то ответ — это переменная параметра $content. Вы уже обрабатываете её в своем коде.

Также в вашем примере, похоже, есть третий шорткод, [caption], который вы не обрабатываете. Это сделано намеренно? Похоже, вы не хотите получать итоговый HTML с ним, поэтому данное решение предполагает, что он вам не нужен.

Я предположу, что вам нужен простой в использовании формат шорткода, например:

[slide=ЗаголовокИзображения][slideimg]http://some.domain/slide.jpg[/slideimg][slidecap]Это подпись.[/slidecap][/slide]

Который можно затем обработать, просто изменив ваши функции следующим образом:

function shortcode_slide($atts, $content = null) {
    if(empty($atts)) {
        $img_title='';
    } else {
        // [slide=Заголовок]...[/slide]
        // [slide="Многословный заголовок"]...[/slide]
        $atts = $this->attributefix( $atts );
        $img_title = '<h2>'.trim(array_shift($atts),'="').'</h2>'; // Удаляем кавычки и знак равенства.
    }

    $content = wpautop(trim($content));
    return '<div class="singe_slide">'.$img_title. do_shortcode($content) . '</div>';
}
add_shortcode('slide', 'shortcode_slide');

function shortcode_slidecap($atts, $content = null) {
    $content = wpautop(trim($content));
    return '<div class="slide_caption"><div class="captExt">' . do_shortcode($content) . '</div></div>';
}
add_shortcode('slidecap', 'shortcode_slidecap');

function shortcode_slideimg($atts, $content = null) {
    $content = wpautop(trim($content));
    return '<img src="'.$content.'" />';
}
add_shortcode('slideimg', 'shortcode_slideimg');

Это должно сгенерировать рабочий HTML.

21 мая 2016 г. 18:26:00
Комментарии

Отлично, спасибо. Завтра попробую и посмотрю, получится ли заставить это работать.

DRK DRK
22 мая 2016 г. 04:34:52