Cum să creezi un shortcode cu conținut HTML și PHP în WordPress
Vreau să creez un shortcode pentru unul dintre conținuturile din temă.
Conținutul din template-ul meu:
<section id="standing" style="background-image: url('<?php echo (get_option('pixieclash-standings-background') && get_option('pixieclash-standings-background') != null) ? esc_url(get_option('pixieclash-standings-background')) : get_stylesheet_directory_uri() . '/images/standings-bg.jpg' ?>');">
<div class="container">
<?php
$headTxt = get_option('pixieclash-standings-section-heading-top');
$bottomText = get_option('pixieclash-standings-section-heading-bottom');
?>
<?php if(!empty($headTxt) || !empty($bottomText)): ?>
<article class="head">
<?php if(!empty($headTxt)): ?>
<h4><?php echo esc_attr($headTxt); ?></h4>
<?php endif; ?>
<?php if(!empty($bottomText)): ?>
<h3><?php echo esc_attr($bottomText); ?></h3>
<?php endif; ?>
</article>
<?php endif; ?>
<?php
$groups = pixieclash_standings_groups();
if(!empty($groups)):
$i = 1;
$onlyOne = count($groups) > 1 ? '' : 'onlyOne';
foreach($groups as $group):
$competitors = pixieclash_standings($group['id']);
?>
<article class="table <?php echo ($i % 2 != 0) ? 'first' : 'second' ?> <?php echo $onlyOne ?>">
<h5 class="group-name"><?php esc_html_e('Group', 'pixieclash') ?> <?php echo esc_attr($group['name']) ?></h5>
<table class="table-body">
<thead>
<tr>
<th><?php esc_html_e('Competitor', 'pixieclash') ?></th>
<th rel="match<?php echo esc_attr($group['id']) ?>"><?php esc_html_e('M', 'pixieclash') ?></th>
<th rel="win<?php echo esc_attr($group['id']) ?>"><?php esc_html_e('W', 'pixieclash') ?></th>
<th rel="till<?php echo esc_attr($group['id']) ?>"><?php esc_html_e('T', 'pixieclash') ?></th>
<th rel="loss<?php echo esc_attr($group['id']) ?>"><?php esc_html_e('L', 'pixieclash') ?></th>
<th rel="point<?php echo esc_attr($group['id']) ?>"><?php esc_html_e('P', 'pixieclash') ?></th>
</tr>
</thead>
<tbody>
<?php if(!empty($competitors)): foreach($competitors as $competitor): ?>
<tr>
<td>
<figure>
<img src="<?php echo esc_url($competitor['logo']) ?>" alt="<?php echo esc_attr($competitor['name']) ?>">
</figure>
<?php echo esc_attr($competitor['name']) ?>
</td>
<td rel="match<?php echo esc_attr($group['id']) ?>"><?php echo esc_attr($competitor['played']) ?></td>
<td rel="win<?php echo esc_attr($group['id']) ?>"><?php echo esc_attr($competitor['wins']) ?></td>
<td rel="till<?php echo esc_attr($group['id']) ?>"><?php echo esc_attr($competitor['till']) ?></td>
<td rel="loss<?php echo esc_attr($group['id']) ?>"><?php echo esc_attr($competitor['losses']) ?></td>
<td rel="point<?php echo esc_attr($group['id']) ?>"><?php echo esc_attr($competitor['points']) ?></td>
</tr>
<?php endforeach; else: ?>
<tr>
<td colspan="6"><?php esc_html_e('No competitors', 'pixieclash') ?></td>
</tr>
<?php endif; ?>
</tbody>
</table>
</article>
<?php $i ++; endforeach; endif; ?>
</div>
</section>
Am încercat să creez shortcode-ul folosind add_shorcode('table', 'numele acestei funcții');
dar nu a funcționat pentru mine.
Cum pot face asta?
Pentru a crea un shortcode din funcțiile tale, trebuie să folosești următorul cod:
function my_shortcode_function(){
if (get_option('pixieclash-standings-background') && get_option('pixieclash-standings-background') != null) {
$background = esc_url(get_option('pixieclash-standings-background'))
} else {
$background = get_stylesheet_directory_uri() . '/images/standings-bg.jpg';
}
$headTxt = get_option('pixieclash-standings-section-heading-top');
$bottomText = get_option('pixieclash-standings-section-heading-bottom');
if(!empty($headTxt)){
$text_header = '<h4>'. esc_attr($headTxt);.'</h4>';
} else {
$text_header = '';
}
if(!empty($bottomText)) {
$text_footer = '<h3>'.esc_attr($bottomText); .'</h3>';
} else {
$text_footer ='';
}
if(!empty($headTxt) || !empty($bottomText)){
$container = '<article class="head">'. $text_header . $text_footer.'</article>';
}
$groups = pixieclash_standings_groups();
if(!empty($groups)) {
$i = 1;
$onlyOne = (count($groups) > 1 ) ? '' : 'onlyOne';
$competitors ='';
foreach($groups as $group){
$competitors .= pixieclash_standings($group['id']);
}
}
$data = '
<section id="standing" style="background-image: url("'.$background.'");">
<div class="container">'.$container.$competitors'</div>
</section>';
return $data;
}
add_action('my-table-shortcode','pixieclash_standings_two');
Asigură-te că alegi un nume unic pentru shortcode-ul tău.
Acum folosește următoarele pentru a afișa shortcode-ul tău:
[my-table-shortcode]
Sau folosește do_shortcode()
într-un fișier PHP:
echo do_shortcode('[my-table-shortcode]');
PS: Te rog să notezi că, deoarece nu am avut acces la funcțiile tale, nu am putut valida exact codul. Poți verifica jurnalul de erori pentru orice probleme dacă codul nu funcționează conform intenției.
ACTUALIZARE
Există o soluție foarte ușoară care cred că funcționează mai bine în cazul tău, și anume folosirea ob_start()
. Aceasta va înregistra orice ieșire a conținutului tău și o va stoca într-o valoare pentru a o returna mai târziu. Uită-te la aceasta:
function my_content_shortcode(){
ob_start();?>
<section id="standing" style="background-image: url('<?php echo (get_option('pixieclash-standings-background') && get_option('pixieclash-standings-background') != null) ? esc_url(get_option('pixieclash-standings-background')) : get_stylesheet_directory_uri() . '/images/standings-bg.jpg' ?>');">
<div class="container">
<?php
$headTxt = get_option('pixieclash-standings-section-heading-top');
$bottomText = get_option('pixieclash-standings-section-heading-bottom');
?>
<?php if(!empty($headTxt) || !empty($bottomText)): ?>
<article class="head">
<?php if(!empty($headTxt)): ?>
<h4><?php echo esc_attr($headTxt); ?></h4>
<?php endif; ?>
<?php if(!empty($bottomText)): ?>
<h3><?php echo esc_attr($bottomText); ?></h3>
<?php endif; ?>
</article>
<?php endif; ?>
<?php
$groups = pixieclash_standings_groups();
if(!empty($groups)):
$i = 1;
$onlyOne = count($groups) > 1 ? '' : 'onlyOne';
foreach($groups as $group):
$competitors = pixieclash_standings($group['id']);
?>
<article class="table <?php echo ($i % 2 != 0) ? 'first' : 'second' ?> <?php echo $onlyOne ?>">
<h5 class="group-name"><?php esc_html_e('Group', 'pixieclash') ?> <?php echo esc_attr($group['name']) ?></h5>
<table class="table-body">
<thead>
<tr>
<th><?php esc_html_e('Competitor', 'pixieclash') ?></th>
<th rel="match<?php echo esc_attr($group['id']) ?>"><?php esc_html_e('M', 'pixieclash') ?></th>
<th rel="win<?php echo esc_attr($group['id']) ?>"><?php esc_html_e('W', 'pixieclash') ?></th>
<th rel="till<?php echo esc_attr($group['id']) ?>"><?php esc_html_e('T', 'pixieclash') ?></th>
<th rel="loss<?php echo esc_attr($group['id']) ?>"><?php esc_html_e('L', 'pixieclash') ?></th>
<th rel="point<?php echo esc_attr($group['id']) ?>"><?php esc_html_e('P', 'pixieclash') ?></th>
</tr>
</thead>
<tbody>
<?php if(!empty($competitors)): foreach($competitors as $competitor): ?>
<tr>
<td>
<figure>
<img src="<?php echo esc_url($competitor['logo']) ?>" alt="<?php echo esc_attr($competitor['name']) ?>">
</figure>
<?php echo esc_attr($competitor['name']) ?>
</td>
<td rel="match<?php echo esc_attr($group['id']) ?>"><?php echo esc_attr($competitor['played']) ?></td>
<td rel="win<?php echo esc_attr($group['id']) ?>"><?php echo esc_attr($competitor['wins']) ?></td>
<td rel="till<?php echo esc_attr($group['id']) ?>"><?php echo esc_attr($competitor['till']) ?></td>
<td rel="loss<?php echo esc_attr($group['id']) ?>"><?php echo esc_attr($competitor['losses']) ?></td>
<td rel="point<?php echo esc_attr($group['id']) ?>"><?php echo esc_attr($competitor['points']) ?></td>
</tr>
<?php endforeach; else: ?>
<tr>
<td colspan="6"><?php esc_html_e('No competitors', 'pixieclash') ?></td>
</tr>
<?php endif; ?>
</tbody>
</table>
</article>
<?php $i ++; endforeach; endif; ?>
</div>
</section><?php
$content = ob_get_contents();
ob_end_clean();
return $content;
}
add_action('my-table-shortcode','my_content_shortcode');
Acum, folosind [my-table-shortcode]
într-un widget de text sau conținut va acționa exact ca secțiunea ta, la fel ca folosirea echo do_shortcode('[my-table-shortcode]');
într-un fișier php.

@Nienormalny_ Am adăugat o altă soluție simplă pentru tine. Doar copiază răspunsul UPDATE în fișierul tău functions.php
și folosește shortcode-ul. Și dacă a funcționat, singurul lucru pe care îl poți face este să accepți și/sau să votezi răspunsul în schimb :)

Deci când pun acest cod în interiorul functions.php îmi arată o pagină albă. Când îl pun sub codul original <section> cu <?php...?> atunci îmi arată numele shortcode-ului între paranteze.

@Nienormalny_ Poate exista o eroare de sintaxă sau o problemă cu tag-urile php <?php
și ?>
. Te rog verifică jurnalul de erori pentru mai multe informații sau activează WP_DEBUG
în instalarea ta.

// Shortcode pentru generarea dinamică a barei laterale function sidebar_detail_payedpost( $shortcode_attr, $shortcode_content ) {
// echo "sidebar";
$current_cat_id = get_queried_object_id();
$count_post=get_term($current_cat_id);
$city = isset($_GET['locationID']) ? base64_decode($_GET['locationID']) : $_SESSION['prefer_city'];
$args = array(
'post_type' => 'classified',
'tax_query' => array(
array(
'taxonomy' => 'classified_location',
'field' => 'id',
'terms' => array($city),
'operator' => 'IN',
)
),
);
$result = new WP_Query($args);
// echo $result->found_posts;
// print_r($result);
// echo "</pre>";
if ( $result-> have_posts() ){
while ( $result->have_posts() ){
$result->the_post();
?>
<!-- <div class="container post_box"> -->
<div class="container">
<?php
$data=get_the_post_thumbnail();
?>
<div class="SidebarPost">
<a href="<?php echo get_permalink(); ?>" data-img='<?php echo ($data); ?>' class="postimage_sidebar" ><?php echo ($data); ?>
</a>
<h5><a href="<?php echo get_permalink(); ?>"><?php the_title(); ?></a></h5>
</div>
</div>
<?php
}
}
}
add_shortcode('DisplayPayablePost', 'sidebar_detail_payedpost');
Acest cod afișează postările plătite în bara laterală și funcționează corect pentru mine. Puteți adăuga HTML și PHP în acest fel.
Este un cod complet testat și corect, sper doar că va funcționa și pentru dumneavoastră.
