Как я могу превратить этот фрагмент PHP в шорткод WordPress?

Это музыкальный сайт с несколькими страницами артистов — по одной странице на исполнителя. Новый контент добавляется как пост с тегом WordPress для обозначения исполнителя. Это сделано для того, чтобы я мог добавить цикл WordPress на каждой странице исполнителя, чтобы показать все сообщения, отфильтрованные по тегу этого исполнителя.

У меня отфильтрованный цикл работает правильно, но, к сожалению, в настоящее время он полностью написан внутри HTML-кода шаблона страницы, поэтому он фильтрует только один тег. Я не хочу создавать новый шаблон страницы для каждого исполнителя, поэтому я хотел бы добавить его в свой functions.php вместо файла, где я могу вместо этого создать новый шорткод для каждого исполнителя.

Вот текущий код в шаблоне моей страницы, который фильтрует цикл для всех сообщений с нашими seefour тег:

<?php
query_posts( "tag=seefour" );
if ( have_posts() ) { ?>
<?php while ( have_posts() ) { ?>
<?php the_post(); { ?>
<div class="jd-box">
<a href="<?php the_permalink(); ?>">
<?php the_post_thumbnail( ); ?>
<div class="jd-overlay"></div>
<div class="jd-overlay-text">
<?php the_title(); ?>
</div>
</a>
</div>
<?php } ?>
<?php } ?>
<?php } ?>

Я предполагаю, что лучший вариант, чтобы превратить это в seefour шорткод внутри моего functions.php файл — как мне этого добиться?

Бонусный вопрос: это устойчиво в долгосрочной перспективе (с 30-50+ артистами) или это вызовет много избыточного кода? Открыт для предложений …

Постскриптум Я знаю, что на этот вопрос уже отвечали (начиная с необработанного PHP), но так как я начинаю с сочетания HTML / PHP (и я новичок в PHP), я просто не могу заставить его работать. Итак, мои извинения за вопрос еще раз.

1

Решение

Прежде всего, вы никогда не должны использовать query_posts(), Это внутренняя функция WordPress для создания и поддержки основного цикла WordPress. Используя его, вы можете разбить ваш сайт непредсказуемым образом. Вы должны использовать get_posts() или же WP_Query вместо.

Чтобы иметь свой собственный шорткод, добавьте в файл functions.php следующее:

function showtag_shortcode( $atts ) {
$atts = shortcode_atts( array(
'tag' => '', // Default value.
), $atts );

$posts = get_posts( 'tag=' . $atts['tag'] );
if ( $posts ) {
$output = '';
foreach ( $posts as $post ) {
setup_postdata( $post );
$output .= '<div class="jd-box">';
$output .= '<a href="' . get_the_permalink( $post ) . '">';
$output .= get_the_post_thumbnail( $post );
$output .= '<div class="jd-overlay"></div>';
$output .= '<div class="jd-overlay-text">';
$output .= get_the_title( $post );
$output .= '</div>';
$output .= '</a>';
$output .= '</div>';
}
} else {
$output = 'no data';
}
wp_reset_postdata();

return $output;
}

add_shortcode( 'showtag', 'showtag_shortcode' );

Эта функция создана [showtag] шорткод с одним параметром: tag, Вы можете использовать этот шорткод на любой странице следующим образом:

[showtag tag="seefour"]
[showtag tag="disco"]

и т.д. У вас будут сообщения с соответствующими тегами, которые будут отображаться вместо вашего шорткода.

1

Другие решения

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

Если это так, лучшим вариантом будет сделать этот код шаблон страницы Artist и передать переменную в URL, т.е. http://example.com/artist?t=seefour а затем используйте следующий код в шаблоне страницы.

<?php
/**
* Template Name: Artist
*/

query_posts( "tag=" . $_GET['t'] );
if ( have_posts() ) {
?>
<?php while ( have_posts() ) { ?>
<?php the_post(); { ?>
<div class="jd-box">
<a href="<?php the_permalink(); ?>">
<?php the_post_thumbnail( ); ?>
<div class="jd-overlay"></div>
<div class="jd-overlay-text">
<?php the_title(); ?>
</div>
</a>
</div>
<?php
}
}
}
?>

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

0

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector