Come creare uno shortcode con contenuto HTML e PHP?

23 mag 2017, 00:44:29
Visualizzazioni: 15.6K
Voti: 0

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?

2
Commenti

Quale parte stai cercando di sostituire con uno Shortcode? Uno Shortcode deve return una stringa contenente tutto il contenuto che vuoi sostituire al posto del segnaposto dello Shortcode.

Milo Milo
23 mag 2017 20:12:33

Voglio creare uno shortcode per questa sezione <section> ..... </section>

Nienormalny_ Nienormalny_
23 mag 2017 22:39:34
Tutte le risposte alla domanda 2
5

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.

23 mag 2017 02:03:27
Commenti

@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 :)

Johansson Johansson
24 mag 2017 00:33:00

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_ Nienormalny_
24 mag 2017 09:52:51

@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.

Johansson Johansson
24 mag 2017 21:12:07

ok lo controllerò

Nienormalny_ Nienormalny_
25 mag 2017 14:27:14

Quindi l'ho testato ma il log di debug non mi mostra nulla e non ha errori. Continua a mostrarmi lo shortcode. Se vuoi posso darti il link di codeanywhere ma solo in privato. E puoi vedere cosa è successo lì.

Nienormalny_ Nienormalny_
25 mag 2017 19:43:05
0

// 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.

21 dic 2018 06:20:29