Come creare uno shortcode con contenuto HTML e PHP?
Voglio creare uno shortcode per uno dei contenuti del tema.
Il contenuto del mio template:
<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>
Ho provato a creare lo shortcode usando add_shortcode('table', 'nome di questa funzione');
ma non ha funzionato.
Come posso farlo?
Per creare uno shortcode dalle tue funzioni, devi utilizzare il seguente codice:
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');
Assicurati di scegliere un nome univoco per il tuo shortcode.
Ora utilizza il seguente codice per visualizzare il tuo shortcode:
[my-table-shortcode]
Oppure, utilizza do_shortcode()
in un file PHP:
echo do_shortcode('[my-table-shortcode]');
PS: Nota bene, poiché non ho accesso alle tue funzioni non ho potuto validare esattamente il codice. Puoi controllare il log degli errori per eventuali problemi se il codice non funziona come previsto.
AGGIORNAMENTO
C'è una soluzione molto semplice che penso funzioni meglio nel tuo caso, ed è utilizzare ob_start()
. Questo registrerà ogni output del tuo contenuto e lo memorizzerà in un valore da restituire successivamente. Guarda questo esempio:
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('Gruppo', 'pixieclash') ?> <?php echo esc_attr($group['name']) ?></h5>
<table class="table-body">
<thead>
<tr>
<th><?php esc_html_e('Competitore', '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('V', 'pixieclash') ?></th>
<th rel="till<?php echo esc_attr($group['id']) ?>"><?php esc_html_e('P', 'pixieclash') ?></th>
<th rel="loss<?php echo esc_attr($group['id']) ?>"><?php esc_html_e('S', 'pixieclash') ?></th>
<th rel="point<?php echo esc_attr($group['id']) ?>"><?php esc_html_e('Pt', '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('Nessun competitore', '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');
Ora, utilizzando [my-table-shortcode]
in un widget di testo o nel contenuto avrà esattamente lo stesso effetto della tua sezione, così come utilizzare echo do_shortcode('[my-table-shortcode]');
in un file PHP.

@Nienormalny_ Ho aggiunto un'altra soluzione semplice per te. Basta copiare la risposta UPDATE nel tuo file functions.php
e usare lo shortcode. E se funziona, l'unica cosa che puoi fare è accettare e/o votare positivamente la risposta in cambio :)

Quindi quando inserisco questo codice dentro functions.php mi mostra una pagina bianca. Quando lo metto sotto il codice <section> originale con <?php...?> allora mi mostra il nome dello shortcode con le parentesi.

@Nienormalny_ Potrebbe esserci un errore di sintassi o un problema con i tag php <?php
e ?>
. Per favore controlla il tuo log degli errori per maggiori informazioni, o attiva WP_DEBUG
nella tua installazione.

// Shortcode per generare una sidebar dinamica 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', // Tipo di post: annunci
'tax_query' => array(
array(
'taxonomy' => 'classified_location', // Tassonomia: ubicazione annuncio
'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() ){ // Se ci sono post
while ( $result->have_posts() ){ // Ciclo attraverso i post
$result->the_post();
?>
<!-- <div class="container post_box"> -->
<div class="container">
<?php
$data=get_the_post_thumbnail(); // Ottiene l'immagine in evidenza
?>
<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'); // Registra lo shortcode
Questo codice mostra gli annunci a pagamento nella sidebar e funziona perfettamente per me. Puoi aggiungere HTML e PHP in questo modo.
È un codice completamente testato e corretto, spero solo che funzioni anche per te.
