来自旧插件的突然奇怪的行为

时间:2015-02-16 01:56:37

标签: php wordpress

我在下面创建了一个插件,以显示一个简单的帖子分级列表(在这种情况下是职位空缺)。

最近,它开始错误地显示层次结构中第一个项目的标题 - 获取其中一个子类别的标题。我无法理解为什么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'];
?>
	<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>
	<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>
	<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>	
	<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>	
	
<?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);
 	
 	/* 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 
	echo "<ul class='items'>";
	
	query_posts( array( 'showposts' => $fss_numposts ) );
	if ( have_posts() ) : while ( have_posts() ) : the_post();
	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>";
	
	endwhile; endif; wp_reset_query();
	
	echo "</ul>";
	echo"<a href='".$fss_vacurl."' class='view'>".$fss_morevac."</a>";
 
	echo $after_widget;
  }
 
}
add_action( 'widgets_init', create_function('', 'return register_widget("FSSVacancyWidget");') );
?>
&#13;
&#13;
&#13;

1 个答案:

答案 0 :(得分:1)

您的小部件已完全过时,无法尝试调试和修复。不幸的是,这是事实。

以下是重大问题

  • 去年支持php 5.3,你仍然支持之前的版本,导致黑客可以轻易利用的安全漏洞

  • 不应该使用
  • create_function(),这是pre php 5.3。这是代码中严重的安全循环漏洞,非常危险。使用在php 5.3中引入并且仍然支持的正确闭包(function()

  • 一年前,
  • extract()已完全从Wordpress核心中移除。 ( CAVEAT:我认为仍然有一个功能,核心开发人员仍然需要找到替代品,只是不记得哪一个)。 extract()非常不一致,并且会破坏实例中的变量。你应该避免使用它。事实上,它已从核心中的所有功能中删除,它应该真的告诉你它有多糟糕

  • 您绝不能使用query_posts。它打破了主要查询和非常重要的功能,如get_queried_object()和全局变量,如$post,其上有很多插件和其他功能,如最近的帖子所依赖。它完全打破了分页,在大多数情况下完全失败,特别是无限滚动的情况。 query_posts在重新运行查询时也会降低页面加载速度。您应该在小部件中使用WP_Query

  • 使用构造函数方法(__construct)而不是类名作为主构造函数。这是pre php5语法。正如我已经说过的,去年你的php 5.3被删除了,为什么你还在支持版本5之前的版本。我不能强调这一点,对这些旧版本的支持会导致安全漏洞

我可以给你解决问题的最佳建议是查看Widget APIWP_Query,然后根据这些指南重写(实际上写一个完整的新小部件)你的widgt