Шорткод. Блок записей в контенте страниц. Урок 1

Шорткод

От автора: В этом уроке мы решим одну интересную задачу, используя возможности шорткода. Суть задачи состоит в том, чтобы дать возможность администратору сайта на WordPress добавлять в любое место контента страниц или записей блок ссылок на записи определенной рубрики (или рубрик). При этом все должно происходить максимально просто и быстро для администратора сайта.

автор

Автор: Андрей Кудлай

Зовут меня Андрей Кудлай. Родом я из Украины, живу в Днепропетровске. Веб-программированию учился сам. Неплохо знаю HTML, CSS, PHP, JavaScript.

скачать исходникискачать урок

Итак, для решения задачи мы будем использовать шорткод. Шорткод – это т.н. короткий код, который напоминает BB-тэги. Если шорткод зарегистрирован на сайте, то WordPress выполнит привязанную к нему функцию, заменив сам шорткод результатом работы привязанной функции.

Наш шорткод будет выглядеть примерно так: [wfm-cats id="2,3" count="3"].

Как видим, шорткод поддерживает 2 атрибута, первый из которых — id – предполагает номер рубрики (номера рубрик), из которой нужно получить записи. Второй атрибут (count) отвечает за количество записей, которые необходимо получить.

В видео версии урока вы найдете подробное комментирование кода, здесь же я просто выложу его листинг, который необходимо поместить в файл functions.php активной темы:

add_shortcode( 'wfm-cats', 'wfm_add_category_posts' );
function wfm_add_category_posts($atts){
	if( empty($atts['id']) ) return;
	$per_page = !empty($atts['count']) ? (int)$atts['count'] : 3;
	if( $per_page < 1 ) $per_page = 3;

	$cats_id = explode(',', $atts['id']);
	
	$get_posts = new WP_Query(
		array(
			'category__in' => $cats_id,
			'posts_per_page' => $per_page
		)
	);

	$content = '';

	if( $get_posts->have_posts() ){
		$content .= '<div class="insert-posts">';
		while( $get_posts->have_posts() ){
			$get_posts->the_post();
			$content .= '<p>' . get_the_title() . '</p>';
		}
		$content .= '</div>';
	}

	return $content;
}

В следующем уроке мы доработаем наш шорткод, реализовав вывод миниатюр выводимых записей.

На этом наш урок завершен. Удачи и до новых встреч!

Хотите быстро научиться создавать сайты и блоги на WordPress с уникальным дизайном?

Получите самую полную в Рунете бесплатную систему обучения создания сайтов на WordPress “Уникальный сайт с нуля”

Получить

Метки: ,

Комментарии Вконтакте:

Комментарии Facebook:

Комментарии (24)

  1. Вячеслав

    Привет. Отличное видео.
    Правильно я понимаю, что данный код выводит всегда одни и те же статьи? Или все таки рандомно?

    Подскажи пожалуйста, как сделать тоже самое, но только страниц, уже голову сломал, не получается.

    • Андрей Кудлай

      Приветствую.
      Да, код будет брать последние статьи выбранных категорий. Для добавления рандомной выборки можно использовать параметр сортировки orderby => rand.

  2. Евгений

    Как раз то, что я безуспешно пытался найти на просторах сети! Огромное спасибо!

    Помещать сторонний пользовательский код в файл functions.php не есть хорошая идея. Для этой цели более грамотным и правильным решением будет создание отдельного плагина.

    Пишем шорткоды? Создаем плагин с условным названием «shortcodes» и вносим туда всё, что нам необходимо. Плагин и соответственно код в нём можно всегда включить и выключить при необходимости, а также легко перенести с одного сайта на другой.

    Файл functions.php предназначен для решения более глобальных задач, для которых содержит соответствующий код. И всё подряд писать в него не нужно.

  3. Олег

    Спасибо за хорошее объяснение

  4. Михаил

    Добрый день. Подскажите. Добавляю page_not_in, для исключения вывода текущего поста, но он не срабатывает. Вы сами не пробовали?

    • Андрей Кудлай

      Здравствуйте, Михаил.
      А откуда Вы взяли параметр page_not_in? Насколько я знаю, такого нет. Есть параметр post__not_in, где в виде массива можно передать ID постов, которые не должны выводиться: ‘post__not_in’ => array(1,2), // кроме постов 1 и 2
      Соответственно, если нужно вывести все посты, кроме текущего, тогда код будет примерно таким:
      global $post;
      // и в запросе
      'post__not_in' => array($post->ID),

  5. Михаил

    Да, ошибся) Последний вопрос- global $post в какое место кода вставить?

  6. Степан

    Здравствуйте! Не подскажите можно ли использовать шорткод для вывода определенной строки или слова из станицы или записи и если можно то не объясните как это можно сделать.

    • Андрей Кудлай

      Здравствуйте, Степан. Думаю, можно. Вот только вопрос мне не совсем понятен. Не очень понятно по какому признаку что-то нужно взять и куда это что-то нужно вывести.

      • Степан

        Есть страница на сайте, она с таблицей.
        Задача: взять из определённой ячейки конкретный текст и вставить через шорткод в другую страницу . Ну то-есть в шорткоде я бы вписал: «id=1 страницы и номер строки=20″ для вывода нужной информации. Помогите пожалуйста.

        • Андрей Кудлай

          Помочь могу только советом, как такое сделать. Описать в коде все это дело не так просто, поскольку это будет чуть больше, чем несколько строк кода. Ну а записывать урок будет вряд ли интересно, поскольку задача очень специфична и вряд ли интересна многим.
          Ну а шорткод делается примерно так. По ID получаем контент страницы или поста. Далее составляем регулярное выражение, которое разберет контент и вытащит нужную строку таблицы из контента. Это первый вариант. Второй вариант — распарсить адрес (URL страницы) и вытащить, опять таки, нужную строку таблицы из контента. Примерно так.

  7. Степан

    Спасибо за совет.

  8. Елена

    Здравствуйте, спасибо за уроки — у меня возникло желание размещать новости на главной странице в виде ряда миниатюр и даже искать нигде не стала, а сразу «пошла» на ваш сайт, так как была уверена, что только здесь можно найти профессиональный ответ. И не ошиблась! И если можно, то продолжу вопрос Степана (от 15.12.2015). Хотелось бы кроме миниатюры вывести и название статьи, где в коде это нужно прописать. Спасибо.

    • Андрей Кудлай

      Здравствуйте.
      - Хотелось бы кроме миниатюры вывести и название статьи… — Наверное Вы все же имели в виду именно вывод миниатюры, поскольку название статьи в коде выводится. Если так, то за вывод миниатюры отвечает функция the_post_thumbnail(). Добавьте вызов этой функции в переменную $content, точно так же, как и вызов функции the_title().

  9. Анна

    Спасибо за полезную информацию!! Реализовала у себя на сайте без проблем!! Все отлично работает!! Единственный вопрос: как сделать заголовок выводимой статьи ссылкой? Голову поломала — не получается((( помогите плиииииз
    Что нужно дописать в строке, чтобы тайтл стал ссылкой?!?!?!?!?
    $content .= » . get_the_title() . »;

    • Андрей Кудлай

      Анна, посмотрите второй урок, в нем показано, как добавить ссылку.

      • Анна

        Не вижу(((
        Нашла только как добавить ссылку с картинки. Пробовала подобным образом прописать для тайтла, не вышло(((
        Шорткоды никогда не писала и с функциями только начинаю дружить… чайник чайником. Весь инет перелопатила — не могу найти такой инфы. Я понимаю, что Вы такие коды как семечки шлепаете, а я увы пока никак.
        С благодарностью

        • Андрей Кудлай

          Анна, ну так а какая разница, что обернуть в ссылку? Хоть картинку, хоть название статьи — разницы нет, просто вместо картинки оставьте название. Во втором уроке есть ведь нужный код… вот строчка, которая Вам нужна, замените ею вывод названия и название будет ссылкой:
          $content .= '<p><a href="' . get_permalink() . '" rel="nofollow">' . get_the_title() . '</a></p>';

          • Анна

            Спасибо большое!! Все получилось!!
            Я так и поняла, что нужно обернуть ссылкой тайтл, как и картинку, но на деле не получалось((( видимо где-то что-то не прописала.

          • Андрей Кудлай

            Да, точно так. Пожалуйста)

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

Можно использовать следующие HTML-теги и атрибуты: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

Я не робот.

Spam Protection by WP-SpamFree