Можете ли вы добавить оператор if / get / echo в шорткод - PullRequest
0 голосов
/ 14 апреля 2020

В течение некоторого времени я создавал собственные шорткоды, чтобы помочь отображать различную информацию на моем сайте Wordpress, без необходимости создания пользовательских шаблонов страниц / постов, и это прекрасно работает.

Недавно я также внедрил плагин Advanced Custom Fields, в отличие от мотыги. Я изначально добавлял метабоксы в пользовательские типы постов, и это улучшило способ разработки сайта.

Когда Создавая собственный шаблон сообщения, я могу использовать что-то вроде этого для отображения информации:

<?php if(get_field('email_address'))
{ echo '<a href="mailto://' .get_field('email_address') . '">EMAIL</a></div>'; }
?>

По сути, если у него есть информация, она будет отображаться иначе, ничего не делать. Где у меня есть вопрос, и я не могу понять, есть ли способ получить оператор if / get в деталях add_shortcode?

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

Где я сталкиваюсь с такой проблемой, как электронная почта или веб-сайт. Даже если они не предоставляют ни одного из них, кодировка по-прежнему отображает текст «Электронная почта» или «Веб-сайт», но, очевидно, без ссылки. В идеале - этот текст не будет отображаться вообще.

Так что можно иметь оператор if / get с кодировкой add_shortcode, чтобы это произошло?

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

add_shortcode( 'directory' , 'Directory' );

function Directory($atts) {

$atts = shortcode_atts( array(
    'category' => ''
), $atts );

$categories  = explode(',' , $atts['category']);

$args = array(
        'post_type'     => 'church-directory',
        'post_status'   => 'publish',
        'orderby'         => 'title',
        'order'         => 'ASC',
        'posts_per_page'=> -1,
        'tax_query'     => array( array(
                            'taxonomy'  => 'category',
                            'field'     => 'term_id',
                            'operator' => 'AND',
                            'terms'     => $categories
                        ) )
    );

    $string = '';
    $string .= '<div style="margin-top: -30px;">';
    $query = new WP_Query( $args );

    if( ! $query->have_posts() ) {
        return false;
    }

    while( $query->have_posts() ){
        $query->the_post();
        $string .= '<div id="directoryWrapper">';
        $string .= '<div><h1><a style="text-transform: uppercase;" href="' .get_field('custom_url') . '">' . get_the_title() . '</a></h1></div>';
        $string .= '<div>' .get_field('address') . '</div><div style="clear: both;"></div>';
        $string .= '<div>' .get_field('phone_number') . '&nbsp;&nbsp;';
        $string .= '<a href="mailto://' .get_field('email_address') . '">EMAIL</a>&nbsp;&nbsp;';
        $string .= '<a href="' .get_field('custom_url') . '">WEBSITE</a></div><div style="clear: both;"></div>';
        $string .= '</div>';
    }

    $string .= '</div>';
    wp_reset_postdata();

    return $string;

}

1 Ответ

0 голосов
/ 20 апреля 2020

Итак, я понял это ... вот окончательный код на случай, если он поможет кому-то, желающему сделать что-то подобное:

    add_shortcode('directory', 'Directory');
    function directory($atts){

    $atts = shortcode_atts( array(
    'category' => ''
), $atts );

    $categories  = explode(',' , $atts['category']);

$args = array(
        'post_type'     => 'directory',
        'post_status'   => 'publish',
        'orderby'         => 'title',
        'order'         => 'ASC',
        'posts_per_page'=> -1,
        'tax_query'     => array( array(
                            'taxonomy'  => 'category',
                            'field'     => 'term_id',
                            'operator' => 'AND',
                            'terms'     => $categories
                        ) )
    );

ob_start();

$my_query = new WP_Query( $args );
if( $my_query->have_posts() ) {
    ?>
        <?php
        while ($my_query->have_posts()) : $my_query->the_post(); ?>


        <div id="directoryWrapper">
        <h1><a style="text-transform: uppercase; font-weight: 600;" href="' .get_field('custom_url') . '"><?php the_title(); ?></a></h1>
        <?php if(get_field('address')) { echo '' . get_field('address') . ''; } ?>
        <?php if(get_field('phone_number')) { echo '<br>' . get_field('phone_number') . '&nbsp;'; } ?>
        <?php if(get_field('email_address')) { echo '<a href="mailto://' .get_field('email_address') . '">EMAIL</a>&nbsp;'; } ?>
        <?php if(get_field('custom_url')) { echo '<a href="' .get_field('custom_url') . '">WEBSITE</a>'; } ?>
        <div style="clear: both;"></div>
        </div>


        <?php endwhile; ?>
    <?php 
}
wp_reset_query();//reset the global variable related to post loop
$retVal = ob_get_contents();
ob_end_clean();

return $retVal;
    }
...