Вернуть только шорткод из поста? - PullRequest
4 голосов
/ 09 июня 2011

Можно ли отфильтровать только шорткод из поста, а затем запустить шорткод?

Моя страница выглядит так:

[summary img="images/latest.jpg"]

This here is the summary

[/summary]

Lots of text here...

И я просто хочу отобразить шорткод на определенной странице.

Пробовал с помощью регулярных выражений, но они, похоже, не работают:

$the_query = new WP_Query('category_name=projects&showposts=1');

    //loop
    while ( $the_query->have_posts() ) : $the_query->the_post();
        echo '<b>';
        the_title();
        echo '</b>';
        echo '<p>';

        $string = get_the_content();

        if (preg_match("[\\[[a-zA-Z]+\\][a-zA-Z ]*\\[\/[a-zA-Z]+\\]]", $string , $matches)) {
            echo "Match was found <br />";
            echo $matches[0];
        }

        echo '</p>';
    endwhile;

Есть идеи?

EDIT:

Нашел временное решение.

while ( $the_query->have_posts() ) : $the_query->the_post();

    $content = str_replace(strip_shortcodes(get_the_content()),"",get_the_content());               
    echo do_shortcode($content);

endwhile;

Я видел, что WordPress имеет функцию для чередования коротких кодов, но не для содержимого стрипов Поэтому я заменил раздетую строку содержимого из всего поста, чтобы получить только шорткод. Единственная плохая вещь в этом, что шорткоды должны быть в начале постов.

Ответы [ 5 ]

13 голосов
/ 31 марта 2013

Лучший ответ:

$pattern = get_shortcode_regex();
preg_match('/'.$pattern.'/s', $post->post_content, $matches);
if (is_array($matches) && $matches[2] == 'the_shortcode_name') {
   $shortcode = $matches[0];
   echo do_shortcode($shortcode);
}

Будет выполнен поиск в содержимом сообщения шорткода «the_shortcode_name». Если он его найдет, он сохранит шорткод в переменной $ match. Легко запустить его оттуда.

2 голосов
/ 26 марта 2014

У меня были следующие проблемы с этими ответами:

  1. шаблон регулярного выражения, не содержащий всех зарегистрированных тегов шорткода
  2. невозможность получить все шорткоды с поста

.. и мое решение:

// Return all shortcodes from the post
function _get_shortcodes( $the_content ) {

    $shortcode = "";
    $pattern = get_shortcode_regex();
    preg_match_all('/'.$pattern.'/uis', $the_content, $matches);

    for ( $i=0; $i < 40; $i++ ) {

        if ( isset( $matches[0][$i] ) ) {
           $shortcode .= $matches[0][$i];
        }

    }

    return $shortcode;

}

Используйте это так:

<?php echo do_shortcode( _get_shortcodes( get_the_content() ) ) ?>
1 голос
/ 16 апреля 2014

Поиск в любом месте вашего шорткода

Пример:

[my_shortcode]
[my_shortcode_2]

или

[my_shortcode_2]
[my_shortcode]

functions.php

function get_shortcode($code,$content) {
    $pattern = get_shortcode_regex();
    preg_match_all('/'.$pattern.'/s',$content,$matches);
    if(is_array($matches) && isset($matches[2]) && in_array($code,$matches[2])) {
        $index = array_search($code,$matches[2]);
        $shortcode = $matches[0][$index];;
        return do_shortcode($shortcode);
    } else {
        return false;
    }
}

Используя пример:

$content = $post->post_content;
$my_shortcode = get_shortcode('my_shortcode',$content);
$my_shortcode_2 = get_shortcode('my_shortcode_2',$content);
echo $my_shortcode;
if($my_shortcode){ // if shortcode#1 found so echo shortcode#2 after
   echo $my_shortcode_2;
}
0 голосов
/ 12 января 2012

Вы можете сделать это, используя функцию get_shortcode_regex(), чтобы получить регулярное выражение для всех зарегистрированных кодов в вашем блоге, применить его к контенту, чтобы получить массив шорткодов, найденных в этом контенте, а затем вызвать соответствующий обратный вызов для его обработки. ты хочешь.

Так что внутри цикла где-то это будет что-то вроде:

$pattern = get_shortcode_regex();
$matches = array();
preg_match_all("/$pattern/s", get_the_content(), $matches);
var_dump($matches); //Nested array of matches
//Do the first shortcode
echo preg_replace_callback( "/$pattern/s", 'do_shortcode_tag', $matches[0][0] );

Это выполнит первый шорткод, найденный в посте, очевидно, на практике вы хотите проверить, что он у вас есть!

0 голосов
/ 09 июня 2011

используйте это регулярное выражение

preg_match('/\[summary[^\]]*](.*)\[\/summary[^\]]*]/uis', $string , $matches)

$ match [1] должно быть вашим текстом

Редактировать: нормально, чтобы соответствовать любой комбинации тегов использовать

/\[([^\]]+)\](.*?)\[\/\1\]/uis

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...