Что может заставить WordPress add_shortcode перестать работать? - PullRequest
2 голосов
/ 16 февраля 2011

Я установил WordPress поверх WordPress много раз, через SVN и заменяя папки ... База данных всегда оставалась неизменной. Внезапно свежая копия из SVN не может работать на двух разных машинах со следующим кодом, из wp survey and quiz tool :

function wpsqt_main_site_quiz_page($atts) {

    extract( shortcode_atts( array(
                    'name' => false
    ), $atts) );

    if ( !$name ){
        require_once WPSQT_DIR.'/pages/general/error.php';
    }

    require_once WPSQT_DIR.'/includes/site/quiz.php';
    ob_start();
    wpsqt_site_quiz_show($name);
    $content = ob_get_contents();
    ob_end_clean();
    return $content;
}

add_shortcode( 'wpsqt_page' , 'wpsqt_main_site_quiz_page' );// Deprecated and will be removed
add_shortcode( 'wpsqt_quiz' , 'wpsqt_main_site_quiz_page' );

Если я использую echo, чтобы увидеть, где достигается код, достигается add_shotcode, а внутри функции нет, и на странице просто отображается это:

[wpsqt_quiz name="test"]

Вместо того, чтобы заменить его ожидаемым quiz.php.

Теперь я просто удалил базу данных, получил новую установку WordPress и плагин, и, конечно, все работало нормально. Если я получу версию SVN, которая не так сильно изменена (в ней только 1 плагин - Magic Fields - и настроенная тема), удалите плагин и установите его снова, он все равно не будет работать!

Что здесь может пойти не так? Что нужно для работы add_shortcode?

1 Ответ

1 голос
/ 17 февраля 2011

Эта проблема беспокоила меня со вчерашнего дня.Наконец, выяснили причину (сейчас), очевидно, в настроенном шаблоне.

Заголовок содержал вызов query_posts, который предположительно может быть вызван только один раз за загрузку страницы.Затем наступает wp_reset_query до спасения .Но ждать!Похоже, что обе эти функции устарели, и ни одна из них не должна использоваться!Вместо этого мы всегда должны использовать объект WP_query .

Итак, это работает, но это неправильно :

<?php query_posts('showposts=10'); ?>  
<?php if (have_posts()) : while (have_posts()) : the_post(); ?>  
   <li><a href="<?php the_permalink() ?>"><?php the_title() ?></a></li>  
<?php endwhile; endif; ?>  
<?php wp_reset_query(); ?>  

и этоправильный и правильный путь :

<?php $r = new WP_Query(array('showposts' => '10', 'what_to_show' => 'posts', 'nopaging' => 0, 'post_status' => 'publish', 'caller_get_posts' => 1)); ?>  
<?php if ($r->have_posts()) : while ($r->have_posts()) : $r->the_post(); ?>  
   <li><a href="<?php the_permalink() ?>"><?php the_title() ?></a></li>    
<?php endwhile; endif; ?> 

Без этого последующие query_posts на самой странице не загружаются должным образом и, следовательно, [wpsqt_quiz name="test"] внутри них (в посте страницы) никогда не вызывается.

Кроме того, похоже, что [wpsqt_quiz name="test"] нельзя добавить на страницу шаблона.

Вот и все.

...