Функция шорткода Wordpress отображается перед содержимым

Я работал над тем, чтобы этот шорткод отображался правильно, но все, что я пробовал, не работает. Ниже моя функция:

    function monster_shortcode( $atts ) {

    $monster = $atts['name'];

    $query = new WP_Query( array(
        'post_type' => 'monsters',
        'name' => $monster,
    ));

    if ( $query->have_posts() ) { 
    while ( $query->have_posts() ) : $query->the_post();
    $monster_title = the_title();
    $monster_size = the_field('size');
    $monster_type = 'type';
    $monster_alignment = the_field( 'alignment' );
    $monster_ac = the_field( 'armor_class' );
    $monster_ac_type = the_field( 'ac_type' );
    $monster_hp = the_field( 'hit_points' );
    $monster_hd = the_field( 'hit_die' );
    $monster_speed = the_field( 'speed' );
    $monster_str = the_field( 'str' );
    $monster_strb = monster_stats( get_field( 'str' ) );
    $monster_dex = the_field( 'dex' );
    $monster_dexb = monster_stats( get_field( 'dex' ) );
    $monster_con = the_field( 'con' );
    $monster_conb = monster_stats( get_field( 'con' ) );
    $monster_int = the_field( 'int' );
    $monster_intb = monster_stats( get_field( 'int' ) );
    $monster_wis = the_field( 'wis' );
    $monster_wisb = monster_stats( get_field( 'wis' ) );
    $monster_cha = the_field( 'cha' );
    $monster_chab = monster_stats( get_field( 'cha' ) );
    $monster_saves = the_field( 'saving_throws' );
    $monster_skills = the_field( 'skills' );
    $monster_dmg = the_field( 'damage_adjustments' );
    $monster_senses = the_field( 'senses' );
    $monster_lang = the_field( 'languages' );
    $monster_cr = the_field( 'cr' );
    $monster_actions = the_field( 'actions' );
    $monster_reactions = the_field( 'reactions' );
    $monster_char = the_field( 'characteristics' );
    $monster_content = the_content();
    $monster_enviro = the_field( 'enviroments' );

    $return = '<h1 class="entry-title">' . $monster_title . '</h1>';
    $return .= '<div class="monster-meta">' . $monster_size . ' ' . $monster_type . ', ' . $monster_alignment . '</div>';
    $return .= '<ul class="monster-stat">';
        $return .= '<li><label>Armor Class</label> ' . $monster_ac . ' (' . $monster_ac_type . ')</li>';
        $return .= '<li><label>Hit Points</label> ' . $monster_hp . ' (' . $monster_hd . ')</li>';
        $return .= '<li><label>Speed</label> ' . $monster_speed . '</li>';
    $return .= '</ul>';
    $return .= '<ul class="monster-stat abilities">';
        $return .= '<li><label>STR</label>' . $monster_str . ' (' . $monster_strb . ')</li>';
        $return .= '<li><label>DEX</label>' . $monster_dex . ' (' . $monster_dexb . ')</li>';
        $return .= '<li><label>CON</label>' . $monster_con . ' (' . $monster_conb . ')</li>';
        $return .= '<li><label>INT</label>' . $monster_int . ' (' . $monster_intb . ')</li>';
        $return .= '<li><label>WIS</label>' . $monster_wis . ' (' . $monster_wisb . ')</li>';
        $return .= '<li><label>CHA</label>' . $monster_cha . ' (' . $monster_chab . ')</li>';
    $return .= ' </ul>';
    $return .= '<ul class="monster-stat">';
        $return .= '<li><label>Saving Throws</label> ' . $monster_saves . '</li>';
        $return .= '<li><label>Skills</label> ' . $monster_skills . '</li>';
        $return .= '<li><label>Damage Adjustments</label> ' . $monster_dmg . '</li>';
        $return .= '<li><label>Senses</label> ' . $monster_senses . '</li>';
        $return .= '<li><label>Langauage</label> ' . $monster_lang . '</li>';
        $return .= '<li><label>Challenge Rating</label> ' . $monster_cr . '</li>';
    $return .= '</ul>';
    $return .= '<p>' . $monster_traits . '</p>';
    $return .= '<h4 class="monster-label">Actions</h2><p>' . $monster_actions . '</p>';
    $return .= '<h4 class="monster-label">Reactions</h2><p>' . $monster_reactions . '</p>';
    $return .= '<h4 class="monster-label">Characteristics</h2><p>' . $monster_char . '</p>';
    $return .= '<h4 class="monster-label">Details</h2><p>' . $monster_content . '</p>';               
    $return .= '<p><label>Enviroments:</label> ' . $monster_enviro . '</p>';

    endwhile;
    }
    return $return;
    wp_reset_postdata();

}
add_shortcode( 'monster', 'monster_shortcode' );

Затем я помещаю шорткод [monster name="men-at-arms"] на страницу. Все переменные функций отображаются перед содержимым сообщения, и все функции html показывают, где они должны быть. Результат можно увидеть здесь https://www.dropbox.com/s/xvuqofya1jylsfl/Screenshot%20%283%29.png?dl=0


person aunrea    schedule 12.03.2018    source источник


Ответы (1)


Вы используете функции отображения вместо функций возврата.

the_title() будет буквально повторять заголовок. Если вы хотите использовать его как переменную, вам нужно использовать get_the_title() (или вы можете установите третий аргумент в false в the_title() - но это обычно нежелательно)

Это относится ко всем используемым вами функциям, которые выводят значение.

the_title() => get_the_title()
the_field() => get_field()
the_content() => get_the_content()

Поскольку теперь он загружает содержимое поста хостинга, вам нужно передать идентификатор из шорткода в functions. Либо так:

$monster    = $atts['name'];
$monster_id = $atts['id'];
   ...
$monster_title = get_the_title( $monster_id );
$monster_size  = get_field( 'size', $monster_id );

Или вот так:

$monster    = $atts['name'];
   ...
$monster_title = get_the_title( $post->ID );
$monster_size  = get_field( 'size', $post->ID );

Кроме того, вы можете удалить ВСЕ определения переменных и просто изменить возвращаемую часть HTML.

while ( $query->have_posts() ) : $query->the_post(); ?>
    <h1 class="entry-title"><?php the_title(); ?></h1>
    <div class="monster-meta"><?php the_field('size'); ?> <?php the_field('type'); ?> <?php the_field('alignment'); ?>
        <ul class="monster-stat">
         ...
    </div>
<?php endwhile; ?>
person Xhynk    schedule 12.03.2018
comment
Это исправило это, так что теперь данные находятся в шаблоне. Однако теперь он извлекает данные из сообщения, в котором находится шорткод, а не данные шорткода. - person aunrea; 13.03.2018
comment
Я обновил ответ - вам либо нужно передать идентификатор функциям: get_the_title( $desired_id ), либо вы можете просто удалить все определения переменных и поместить исходные функции отображения в блок HTML. - person Xhynk; 13.03.2018
comment
Это работает, за исключением того, что я не уверен, как вызвать идентификатор сообщения для сообщения, которое используется в шорткоде. У меня есть только имя, которое вводится в шорткод при публикации. Но как мне попасть в функцию? Я заставил его появиться, вручную введя идентификатор сообщения, просто чтобы проверить, была ли проблема в этом. - person aunrea; 14.03.2018
comment
Тогда, вероятно, проще просто использовать второе решение $monster_title = get_the_title( $post->ID ); - этот код: while ( $query->have_posts() ) : $query->the_post(); должен устанавливать $post (и, следовательно, $post->ID в соответствующий пост для вашего HTML для использования - person Xhynk; 14.03.2018
comment
Да, на самом деле с вашими циклами происходит что-то странное, потому что иначе get_the_title() должен работать нормально без определения идентификатора. Можете ли вы попробовать переименовать свой $query в $monster_query и посмотреть, сработает ли это? - person Xhynk; 14.03.2018
comment
Эта вставка может помочь: pastebin.com/wyY8nzU9. Обратите внимание, что я многое изменил, чтобы уменьшить количество раз. функция get_field выписана, поэтому ее проще модифицировать и добавлять новые переменные. Вот комментарий, в котором объясняется, что и почему: pastebin.com/EuhidrM7 ($monster_traits не похоже быть определено в вашем оригинале, а type было просто строкой, поэтому я оставил черты в покое и предположил, что type должно быть функцией get_field. - person Xhynk; 14.03.2018
comment
Это ничего не изменило. Я думаю, что вместо этого я просто буду использовать идентификатор в шорткоде. Это работает таким образом. За исключением того, что get_the_content( $monster_id ) показывает текущий контент поста, а не контент шорткода поста. - person aunrea; 14.03.2018
comment
Я увидел твой пост уже после того, как написал. Только что попробовал, и это работает! Просто $monster_type = get_the_term_list($post-›ID, 'monster_type', '', ', ', '' ); скучал. Я его вставляю, но он не появляется. Скорее всего проблема с id. - person aunrea; 14.03.2018
comment
Я понял проблему, посмотрев больше на ваш код. Я только что изменил $monster_type в ответе на Только что изменил на . $monster_type = get_the_term_list($post-›ID, 'monster_type', '', ', ', '' ) . и это сработало. Спасибо за помощь! - person aunrea; 14.03.2018
comment
С удовольствием, рад помочь! - person Xhynk; 14.03.2018