PHP / CSS: шорткод не отображается правильно и отображается в заголовке (перед содержимым) на каждой странице

Попытка создать шорткод, который будет внедряться во всплывающее окно. Я пытаюсь отобразить четыре изображения в сетке 2x2 в центре страницы.

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

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

Я пробовал:

ob_start();
return ob_get_clean();

Это останавливает его отображение в заголовке каждой страницы, но и больше ничего не выводит.

Что я делаю неправильно?

Добавляем здесь мою функцию шорткода и CSS для макета сетки 2x2 внизу.

Функция шорткода:

<?php
function my_function() {

$args = array (
'post_type'              => 'my_cpt',
'nopaging'               => false,
'posts_per_page'         => '4',
'order'                  => 'ASC',
'orderby'                => 'rand',
);

$query = new WP_Query( $args );

if ( $query->have_posts() ) {
while ( $query->have_posts() ) {
    $query->the_post();

$image = get_field('my_image_field');
$size = 'medium';?>

<div class = "grid2x2">
    <div class = "thegridbox">
    <div>'  
            ?><a href = "<?php the_field('my_image_link'); ?> ">
                <img src = "<?php wp_get_attachment_image( $image, $size ); ? 
>" />
            </a>                
    </div>  
</div>
</div>

<?php

}

} else {

echo 'Oops! Nothing found.';

}

wp_reset_postdata();    

}
add_shortcode( 'my_shortcode', 'my_function' );
?>

CSS для макета 2x2 frid:

.grid2x2 {
  min-height: 100%;
  display: flex;
  flex-wrap: wrap;
  flex-direction: row;
}
.grid2x2 > div {
  display: flex; 
  flex-basis: calc(50% - 40px);  
  justify-content: center;
  flex-direction: column;
}
.grid2x2 > div > div {
  display: flex;
  justify-content: center;
  flex-direction: row;
}

.thegridbox { margin: 20px; }
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
0
0
177
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Привет. Похоже, это проблема с закрытием и открытием блока div класса grid2X2.

Можете ли вы попробовать следующий код и посмотреть, работает ли он. Также мой редактор показывает синтаксическую ошибку, когда я копирую вставленный ваш код (дополнительное пространство рядом с тегом img). Просто чтобы вы знали, что я не тестировал код, поэтому нет никаких гарантий, что он будет работать.

<?php
function my_function() {

$args = array (
'post_type'              => 'my_cpt',
'nopaging'               => false,
'posts_per_page'         => '4',
'order'                  => 'ASC',
'orderby'                => 'rand',
);

$query = new WP_Query( $args );
$i=0;
ob_start();
if ( $query->have_posts() ) {

while ( $query->have_posts() ) {
    $query->the_post();

$image = get_field('my_image_field');
$size = 'medium';
?>
  <?php if ($i==0 || $i ==2): ?>
<div class = "grid2x2">
<?php endif;?>
    <div class = "thegridbox">
    <div>  
        <a href = "<?php the_field('my_image_link'); ?> ">
                <img src = "<?php wp_get_attachment_image( $image, $size ); ?>" />
            </a>                
    </div>  
</div>
<?php if ($i==1 || $i ==3): ?>
</div>
<?php endif; ?>

<?php
$i++;
}

} else {

echo 'Oops! Nothing found.';

}

wp_reset_postdata();    
return ob_get_clean();
}
add_shortcode( 'my_shortcode', 'my_function' );
?>

Это сработало отлично! Спасибо. Я также пытаюсь добавить абзац, который хочу отобразить в центре поверх сетки. Например, заголовок "4 самых популярных сообщения". Но мой абзац выводится поверх каждого сообщения по отдельности, а не только один раз поверх сетки. Как бы вы к этому подойти? @Santosh Sapkota

re-boot 20.12.2018 21:18

Это потому, что вы неправильно использовали функцию add_shortcode (). Пожалуйста, проверьте это.

"Note that the function called by the shortcode should never produce output of any kind. Shortcode functions should return the text that is to be used to replace the shortcode. Producing the output directly will lead to unexpected results. This is similar to the way filter functions should behave, in that they should not produce expected side effects from the call, since you cannot control when and where they are called from."

function my_function() {
    $retVal = '<div>Lorem ipsum dolor sit amet</div>';
    return $retVal;
}
add_shortcode( 'my_shortcode', 'my_function' );

И есть еще одна хитрость с ob_start () / ob_get_clean () (функция буферизации вывода php). В этом случае вы должны использовать ob_start (); перед началом записи в my_function () вызовите return ob_get_clean (); в конце функции.

<?php
function my_function() {
    ob_start(); ?>

    <div>Lorem ipsum dolor sit amet</div>
    <?php echo '<div>Another Lorem ipsum dolor sit amet</div>';?>

<?php
    return ob_get_clean();
}
add_shortcode( 'my_shortcode', 'my_function' );

Другие вопросы по теме