2015-02-16 2 views
0

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

В последнее время началось неправильное отображение названия первого элемента в иерархии - взятие названия одной из его подкатегорий. Я не могу понять, почему обновление Wordpress или что-то подобное может привести к тому, что это произойдет ?!

<?php 
 

 
class FSSVacancyWidget extends WP_Widget 
 
{ 
 
    function FSSVacancyWidget() 
 
    { 
 
    $widget_ops = array('classname' => 'FSSVacancyWidget', 'description' => 'Displays Recent FSS Jobs on the homepage and all other pages'); 
 
    $this->WP_Widget('FSSVacancyWidget', 'FSS Vacancies', $widget_ops); 
 
    } 
 
    
 
    function form($instance) 
 
    { 
 
    $instance = wp_parse_args((array) $instance, array('title' => '')); 
 
    $title = $instance['title']; 
 
    $fss_numposts = $instance['fss_numposts']; 
 
    $fss_vacurl = $instance['fss_vacurl']; 
 
    $fss_morevac = $instance['fss_morevac']; 
 
?> 
 
\t <p><label for="<?php echo $this->get_field_id('title'); ?>">Title: <input class="widefat" id="<?php echo $this->get_field_id('title'); ?>" name="<?php echo $this->get_field_name('title'); ?>" type="text" value="<?php echo attribute_escape($title); ?>" /></label></p> 
 
\t <p><label for="<?php echo $this->get_field_id('fss_numposts'); ?>">Number of Posts (Default is 10): <input class="widefat" id="<?php echo $this->get_field_id('fss_numposts'); ?>" name="<?php echo $this->get_field_name('fss_numposts'); ?>" type="text" value="<?php echo attribute_escape($fss_numposts); ?>" /></label></p> 
 
\t <p><label for="<?php echo $this->get_field_id('fss_vacurl'); ?>">Vacancy URL: <input class="widefat" id="<?php echo $this->get_field_id('fss_vacurl'); ?>" name="<?php echo $this->get_field_name('fss_vacurl'); ?>" type="text" value="<?php echo attribute_escape($fss_vacurl); ?>" /></label></p> \t 
 
\t <p><label for="<?php echo $this->get_field_id('fss_morevac'); ?>">More Vacancies Title: <input class="widefat" id="<?php echo $this->get_field_id('fss_morevac'); ?>" name="<?php echo $this->get_field_name('fss_morevac'); ?>" type="text" value="<?php echo attribute_escape($fss_morevac); ?>" /></label></p> \t 
 
\t 
 
<?php 
 
    } 
 
    
 
    function update($new_instance, $old_instance) 
 
    { 
 
    $instance = $old_instance; 
 
    $instance['title'] = $new_instance['title']; 
 
    $instance['fss_numposts'] = $new_instance['fss_numposts']; 
 
    $instance['fss_vacurl'] = $new_instance['fss_vacurl']; 
 
    $instance['fss_morevac'] = $new_instance['fss_morevac']; 
 
    return $instance; 
 
    } 
 
    
 
    function widget($args, $instance) 
 
    { 
 
    extract($args, EXTR_SKIP); 
 
    \t 
 
    \t /* User-selected settings. */ 
 
    $fss_numposts = $instance['fss_numposts']; 
 
    $fss_vacurl = $instance['fss_vacurl']; 
 
    $fss_morevac = $instance['fss_morevac']; 
 
    
 
    echo $before_widget; 
 
    $title = empty($instance['title']) ? ' ' : apply_filters('widget_title', $instance['title']); 
 
    
 
    if (!empty($title)) 
 
     echo $before_title . $title . $after_title;; 
 
    
 
    // WIDGET CODE 
 
\t echo "<ul class='items'>"; 
 
\t 
 
\t query_posts(array('showposts' => $fss_numposts)); 
 
\t if (have_posts()) : while (have_posts()) : the_post(); 
 
\t echo "<li><a href='".get_permalink()."'><span class='job-title'>".get_the_title()."</span><span class='job-date'>".get_the_date('d m Y')."</span></a></li>"; 
 
\t 
 
\t endwhile; endif; wp_reset_query(); 
 
\t 
 
\t echo "</ul>"; 
 
\t echo"<a href='".$fss_vacurl."' class='view'>".$fss_morevac."</a>"; 
 
    
 
\t echo $after_widget; 
 
    } 
 
    
 
} 
 
add_action('widgets_init', create_function('', 'return register_widget("FSSVacancyWidget");')); 
 
?>

+0

Я думаю, что это не ваша проблема с кодом, но это ваша проблема с отображением PHP. PHP-код не работает в ваших инструментах фрагментов. он просто отобразил весь код из этой области. –

ответ

1

Ваш виджет полностью устарели и совершенно бесполезно пытаться отладки и исправления. Это, к сожалению, правда.

Вот большие проблемы

  • Поддержка PHP 5.3 была понижена в прошлом году, вы все еще поддерживаете версию до этого, что приводит к vulnerablities в области безопасности, которые могут быть легко использованы хакерами

  • create_function() не следует использовать, это pre php 5.3. Это серьезная дыра в вашем коде, очень опасная. Используйте правильные затворы (function()), которые были введены в php 5.3 и которые все еще поддерживаются

  • extract() был полностью удален из ядра Wordpress год назад. (CAVEAT: Я думаю, что есть еще одна функция, хотя основные разработчики все равно должны найти замену, просто не помню, какой из них). extract() очень несовместим и прерывает переменные внутри экземпляра. Вам следует избегать его использования. Просто тот факт, что он был удален из всех функций в ядре, должен действительно рассказать вам, насколько это плохо.

  • Вы никогда не должны использовать query_posts. Он разбивает основной запрос и очень важные функции, такие как get_queried_object() и globals, такие как $post, от которых зависит столько плагинов и другие функции, как недавние сообщения. Он полностью разбивает разбиение на страницы и в большинстве случаев полностью терпит неудачу, особенно случаи, такие как бесконечный свиток. query_posts также замедляет загрузку страниц при повторном запросе. Вы должны использовать WP_Query вместо этого в своем виджетах

  • Используйте метод конструктора (__construct) вместо имени класса в качестве основного конструктора. Это синтаксис pre php5. Как я уже говорил, PHP 5.3 был понижен в прошлом году, почему вы до сих пор поддерживает версии до версии 5. Я не могу подчеркнуть это достаточно, поддержка таких старых версий приводит к уязвимости

Лучший совет, который я могу дать вы должны решить свою проблему - проверить Widget API и WP_Query, а затем переписать (фактически написать полный новый виджет) в соответствии с этими рекомендациями.

Смежные вопросы