I had the same problem and implemented a quick and dirty fix. Now if the campaign keywords are empty, piwik analyzes the referer url and uses the original search strings from the referer as campaign keywords.
In "core/Tracker/Visit.php" I changed the function "detectRefererCampaign" in class "Piwik_Tracker_Visit_Referer" to this:
protected function detectRefererCampaign()
{
if(isset($this->currentUrlParse['query']))
{
$campaignParameters = Piwik_Common::getCampaignParameters();
$campaignNames = $campaignParameters[0];
foreach($campaignNames as $campaignNameParameter)
{
$campaignName = Piwik_Common::getParameterFromQueryString($this->currentUrlParse['query'], $campaignNameParameter);
if( !empty($campaignName))
{
break;
}
}
if(!empty($campaignName))
{
$this->typeRefererAnalyzed = Piwik_Common::REFERER_TYPE_CAMPAIGN;
$this->nameRefererAnalyzed = $campaignName;
$campaignKeywords = $campaignParameters[1];
$i = 0; //mychanges
$num_elements = count($campaignKeywords);//mychanges
foreach($campaignKeywords as $campaignKeywordParameter)
{
$i++;
$campaignKeyword = Piwik_Common::getParameterFromQueryString($this->currentUrlParse['query'], $campaignKeywordParameter);
if( !empty($campaignKeyword))
{
$this->keywordRefererAnalyzed = $campaignKeyword;
break;
}
elseif ($i == $num_elements) {//mychanges
$searchEngineInformation = Piwik_Common::extractSearchEngineInformationFromUrl($this->refererUrl);//mychanges
Piwik_PostEvent('Tracker.detectRefererSearchEngine', $searchEngineInformation, $this->refererUrl);//mychanges
if($searchEngineInformation !== false){//mychanges
$this->keywordRefererAnalyzed = $searchEngineInformation['keywords'];//mychanges
break;//mychanges
}//mychanges
}//mychanges
}
return true;
}
}
return false;
}
It seems to do what I want - however I haven't used Piwik for long and am not that familiar with the source code, so there might be some side effects I am not aware of.