Recently I wanted to display my stackoverflow account details on my blog – I found the plugin stackoverflow+ which I liked from the screenshots. After installing, it didn’t work. The widget itself displayed, but all the fields it should receive from stackoverflow stayed empty. After viewing the sources I noticed that my hosting didn’t provide zlib, so I implemented and alternative implementation to use curl, in case zlib is not available. The file wsp-functions.php will now look like this:
<?php
function sanitizeObject($d)
{
if (is_object($d)) {
$d = get_object_vars($d);
}
if (is_array($d)) {
return array_map(__FUNCTION__, $d);
} else {
return $d;
}
}
/**
* Uses the Stackoverflow API to get certain data
*
* @param string $ids
* @param string $type
* @return array|mixed
*/
function getUserData($ids, $type = '')
{
// Define Local Variables
$site = 'stackoverflow';
$baseurl = 'http://api.stackexchange.com/2.2/users/';
$apikey = 'sbI47iM9fyMqLqD0sA2T8A((';
//Construct Url and Get Data off SO and use Sanitizer.
if ($type == '') {
$url = $baseurl . $ids . '?key=' . $apikey . '&site=' . $site . '&order=desc&sort=reputation&filter=default';
} else if ($type == 'byQuestionids') {
$url = 'http://api.stackexchange.com/2.2/questions/' . $ids . '?key=' . $apikey . '&site=' . $site . '&order=desc&sort=activity';
} else {
$url = $baseurl . $ids . '/' . $type . '?key=' . $apikey . '&site=' . $site . '&order=desc&sort=activity&filter=default';
}
if (function_exists('curl_version') === true)
$results = json_decode(getJsonFromUrl_curl($url));
else
$results = json_decode(getJsonFromUrl_zlib($url));
$results = sanitizeObject($results);
return $results;
}
/**
* Gets the json data from the given URL (curl implementation)
*
* @param string $url URL as string
* @return string returns the json data as string
*/
function getJsonFromUrl_curl($url) {
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_ENCODING, 'gzip');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$data = curl_exec($ch);
curl_close($ch);
return $data;
}
/**
* Gets the json data from the given URL (zlib implementation)
*
* @param string $url URL as string
* @return string returns the json data as string
*/
function getJsonFromUrl_zlib($url) {
$context = array('http'=>array('header'=>"Accept-Encoding: gzip\r\n"));
$url = "compress.zlib://" . $url;
return file_get_contents($url, false, $context);
}
?>
What happens: In line 37 we do a check to see, if curl is available on the server. If yes, the function “getJsonFromUrl_curl($url)” is called, so the stackexchange API is consumed using curl. If curl is not available, it will use “getJsonFromUrl_zlib($url)”, doing the same using zlib. This procedure requires either curl or zlib to be installed.
In the file “stackoverflow-plus.php” I implemented a check for zlib and curl on plugin activation. If neither is available, plugin activation will fail with a message to the user “Either zlib or curl needs to be installed on the server!”.
<?php
/*
Plugin Name: Stackoverflow+
Plugin URI: http://techstricks.com/wp-plugins/
Description: Stackoverflow Plus integreates your <a href="http://www.stackoverflow.com">Stackoverflow</a> profile with your word press website. Show your Stackoverflow profile, Questions, Answers, Reputation, Badges and much more through a easy to configure widget.
Version: 1.0
Author: Amyth Arora
Author URI: http://www.techstricks.com
*/
load_plugin_textdomain('wordpress-stackoverflow-plus');
if (!defined('WSP_VERSION')) {
define('WSP_VERSION','1.0');
}
if (!defined('WSP_AUTHOR')) {
define('WSP_AUTHOR','Amyth Arora');
}
// import the Widget Class
require_once( plugin_dir_path( __FILE__ ) . 'wsp-widget.php');
//Add the Stylesheet
add_action('wp_enqueue_scripts', 'add_wsp_style');
function add_wsp_style(){
wp_register_style('wsp-style', plugins_url('css/stackoverflow-plus.css', __FILE__));
wp_enqueue_style('wsp-style');
}
function stackoverflowplus_activate() {
if (function_exists('curl_version') === false && function_exists('gzcompress') === false ) {
echo 'Either zlib or curl needs to be installed on the server!';
die;
}
}
register_activation_hook( __FILE__, 'stackoverflowplus_activate' );
?>
I also turned off the accept rate from the widget settings, it doesn’t seem to be provided anymore, see this link. Please note that I only did the modifications for curl – the plugin itself was written by @mytharora.