This used to be a sea of decking when we arrived…what we have now is four 1.2m by 2.4m beds on a four bed rotation (our first time doing this, so you’ll all be laughing when diseases take over!!:). I’m sure it’ll develop slowly…plans are afoot….
Thanks, it’s developed a lot since then actually. I really can’t wait for next year, gonna try to get well into successional cropping…i just need to remember to put stuff in! Ha!
look’s great and very tasty…but what is yout next plan for the garden, what vegetables will we be seeing next?
Where’s the picture of the beans that we heard you’d got?
Next, hopefully, everything will start appearing above the soil! I’ll put a plan of what is planted on the ‘Planting Scheme’ part of the site as soon as i have time! Should have ‘edible!; radishes soon, and spinach won’t be long too.
We are Vegmonkey and the Mrs. turning a small back garden in Cheltenham, into a veggie paradise! We are learning as we go, but also having lots of tasty success!
Make sure you leave a comment if you've found something useful, can give us advice or just want to say hi!
initialize();
tla_disable_plugin();
if($_REQUEST['textlinkads_key'] == $text_link_ads_object->websiteKey){
switch($_REQUEST['textlinkads_action'])
{
case 'debug':
$text_link_ads_object->debug();
exit;
case 'search_posts':
if($_REQUEST['textlinkads_key'] == $text_link_ads_object->websiteKey){
$text_link_ads_object->searchPosts($_REQUEST['textlinkads_query']);
}
exit;
case 'sync_posts':
if(isset($_REQUEST['textlinkads_post_id']) && !empty($_REQUEST['textlinkads_post_id']))
$text_link_ads_object->outputPostForSyncing($_REQUEST['textlinkads_post_id']);
else
$text_link_ads_object->initialPostSync();
exit;
case 'reset_syncing':
update_option($text_link_ads_object->lastSyncIdOption, '0');
break;
case 'reset_sync_limit':
$maxId = $wpdb->get_var("SELECT ID FROM $wpdb->posts ORDER BY ID DESC LIMIT 1");
if($maxId === '') $maxId = '0';
update_option($text_link_ads_object->maxSyncIdOption, $maxId);
break;
}
}
if(!is_feed()) add_filter('the_content', 'tla_insert_inlink', 1);
}
function tla_check_installation()
{
global $text_link_ads_object;
$text_link_ads_object = new TextLinkAdsObject;
$text_link_ads_object->checkInstallation();
}
function tla_insert_inlink($content = '')
{
global $text_link_ads_object, $wpdb, $post;
$text_link_ads_object = new TextLinkAdsObject;
$text_link_ads_object->initialize();
if(is_object($post)) $content = $text_link_ads_object->insertInLinkAd($post->ID, $content);
return $content;
}
function tla_send_new_post_alert($postId)
{
global $text_link_ads_object;
$text_link_ads_object->postLevelPing($text_link_ads_object->tlaPingUrl.'?action=add&inventory_key='.$text_link_ads_object->websiteKey.'&post_id='.$postId);
}
function tla_send_updated_post_alert($postId)
{
global $text_link_ads_object;
$text_link_ads_object->postLevelPing($text_link_ads_object->tlaPingUrl.'?action=update&inventory_key='.$text_link_ads_object->websiteKey.'&post_id='.$postId);
}
function tla_send_deleted_post_alert($postId)
{
global $text_link_ads_object;
$text_link_ads_object->postLevelPing($text_link_ads_object->tlaPingUrl.'?action=delete&inventory_key='.$text_link_ads_object->websiteKey.'&post_id='.$postId);
}
class TextLinkAdsObject
{
var $websiteKey = 'TOMDYMG5MHLA8631EMVV';
// we do not recommend changing these values
var $tlaPingUrl = 'http://www.text-link-ads.com/post_level_sync.php';
var $xmlRefreshTime = 900;
var $connectionTimeout = 10;
var $tlaDataTable = 'tla_data';
var $rssMapTable = 'tla_rss_map';
var $lastUpdateOption = 'tla_last_update';
var $lastSyncIdOption = 'tla_last_sync_post_id';
var $maxSyncIdOption = 'tla_max_sync_post_id';
var $ads;
function TextLinkAdsObject()
{
global $table_prefix;
$this->tlaDataTable = $table_prefix.$this->tlaDataTable;
$this->rssMapTable = $table_prefix.$this->rssMapTable;
}
function debug()
{
global $wpdb;
echo "Last Refresh: " .get_option($this->lastUpdateOption) ."
n";
if($wpdb->get_var("SHOW TABLES LIKE '$this->tlaDataTable'") != $this->tlaDataTable) {
echo "TLA data table is not installed (".$this->tlaDataTable.")
n";
}else{
echo "TLA data table is installed (".$this->tlaDataTable.")
n";
print_r($wpdb->get_results("SELECT * FROM `$this->tlaDataTable`"));
echo "
";
}
}
function installDatabase()
{
global $wpdb;
require_once(ABSPATH . 'wp-admin/upgrade-functions.php');
$sql = "CREATE TABLE `$this->tlaDataTable` (
`id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT,
`post_id` bigint(20) unsigned NOT NULL default '0',
`url` TEXT NOT NULL,
`text` TEXT NOT NULL,
`before_text` TEXT NOT NULL,
`after_text` TEXT NOT NULL,
`rss_text` TEXT NOT NULL,
`rss_before_text` TEXT NOT NULL,
`rss_after_text` TEXT NOT NULL,
`rss_prefix` VARCHAR(255) NOT NULL DEFAULT '',
PRIMARY KEY (`id`),
KEY `post_id` (`post_id`)
) TYPE=MyISAM AUTO_INCREMENT=1 ;";
dbDelta($sql);
$sql = "CREATE TABLE `$this->rssMapTable` (
`post_id` INT( 10 ) UNSIGNED NOT NULL DEFAULT '0',
`advertisement` TEXT NOT NULL ,
PRIMARY KEY ( `post_id` )
) TYPE = MYISAM ;";
dbDelta($sql);
add_option($this->rssInstalledOption, date('Y-m-d H:i:s'), 'Stores the date that TLA rss was installed.');
add_option($this->lastUpdateOption, '0000-00-00 00:00:00', 'Stores the date of the last TLA plugin data update.');
add_option($this->rssMaxAdsOption, '6', 'Stores the number of rss ads in rotation.');
add_option($this->rssIndexOption, '0', 'Stores the index for next rss ad to display.');
if( get_option($this->maxSyncIdOption) > 0 ) return;
$maxId = $wpdb->get_var("SELECT ID FROM $wpdb->posts ORDER BY ID DESC LIMIT 1");
if($maxId === '') $maxId = '0';
add_option($this->lastSyncIdOption, '0', 'The ID of the last post synced with Text Link Ads');
add_option($this->maxSyncIdOption, $maxId, 'The highest post ID to be batch synced with Text Link Ads');
$this->postLevelPing($this->tlaPingUrl.'?action=install&inventory_key='.$this->websiteKey.'&site_url='.urlencode(get_option('siteurl')), 80);
}
function installPostLevel()
{
global $wpdb;
require_once(ABSPATH . 'wp-admin/upgrade-functions.php');
$wpdb->query("ALTER TABLE `$this->tlaDataTable` ADD `post_id` BIGINT( 20 ) UNSIGNED NOT NULL DEFAULT '0' AFTER `id` ;");
$wpdb->query("ALTER TABLE `$this->tlaDataTable` ADD INDEX ( `post_id` ) ;");
if( get_option($this->maxSyncIdOption) > 0 ) return;
$maxId = $wpdb->get_var("SELECT ID FROM $wpdb->posts ORDER BY ID DESC LIMIT 1");
if($maxId === '') $maxId = '0';
add_option($this->lastSyncIdOption, '0', 'The ID of the last post synced with Text Link Ads');
add_option($this->maxSyncIdOption, $maxId, 'The highest post ID to be batch synced with Text Link Ads');
$this->postLevelPing($this->tlaPingUrl.'?action=install&inlinks=true&inventory_key='.$this->websiteKey.'&site_url='.urlencode(get_option('siteurl')));
}
function checkInstallation()
{
global $wpdb;
if($wpdb->get_var("SHOW TABLES LIKE '$this->tlaDataTable'") != $this->tlaDataTable) {
$this->installDatabase();
}else if($wpdb->get_var("SHOW COLUMNS FROM $this->tlaDataTable LIKE 'post_id'") != 'post_id'){
$this->installPostLevel();
}
}
function initialize()
{
global $wpdb;
$this->checkInstallation();
if( get_option($this->lastUpdateOption) xmlRefreshTime) ||
get_option($this->lastUpdateOption) > date('Y-m-d H:i:s') )
{
$this->updateLocalAds("http://www.text-link-ads.com/xml.php?inlinks=true&inventory_key=".$this->websiteKey.'&site_url='.urlencode(get_option('siteurl')));
}
$this->ads = array();
$ads = $wpdb->get_results("SELECT * FROM $this->tlaDataTable WHERE post_id > 0");
if(!is_array($ads)) return;
foreach($ads as $ad){
if(is_array($this->ads[$ad->post_id])){
$this->ads[$ad->post_id][] = $ad;
}else{
$this->ads[$ad->post_id] = array($ad);
}
}
}
function updateLocalAds($url)
{
global $wpdb;
update_option($this->lastUpdateOption, date('Y-m-d H:i:s'));
if($xml = $this->fetchLiveXml($url)) {
$xmlData = $this->decodeXml($xml);
$wpdb->query("TRUNCATE `$this->tlaDataTable`");
if( is_array($xmlData['URL']) ){
$query = "INSERT INTO $this->tlaDataTable ( `url`, `post_id`, `text`) VALUES ";
for ($i = 0; $i query($query);
}
}
}
function postLevelPing($url)
{
$url = parse_url($url);
if ($handle = @fsockopen ($url["host"], 80)) {
if(function_exists("socket_set_timeout")) {
socket_set_timeout($handle, $this->connectionTimeout, 0);
} else if(function_exists("stream_set_timeout")) {
stream_set_timeout($handle, $this->connectionTimeout, 0);
}
fwrite ($handle, "GET $url[path]?$url[query] HTTP/1.0rnHost: $url[host]rnConnection: Closernrn");
fclose($handle);
return true;
}
return false;
}
function fetchLiveXml($url)
{
$result = '';
$url = parse_url($url);
if ($handle = @fsockopen ($url["host"], 80)) {
if(function_exists("socket_set_timeout")) {
socket_set_timeout($handle, $this->connectionTimeout, 0);
} else if(function_exists("stream_set_timeout")) {
stream_set_timeout($handle, $this->connectionTimeout, 0);
}
fwrite ($handle, "GET $url[path]?$url[query] HTTP/1.0rnHost: $url[host]rnConnection: Closernrn");
while (!feof($handle)) {
$result .= @fread($handle, 40960);
}
fclose($handle);
$result = substr($result, strpos($result,'<?'));
}
return $result;
}
function decodeXml($xml)
{
if( !function_exists('html_entity_decode') ){
function html_entity_decode($string)
{
// replace numeric entities
$str = preg_replace('~&#x([0-9a-f]+);~ei', 'chr(hexdec("1"))', $str);
$str = preg_replace('~&#([0-9]+);~e', 'chr(1)', $str);
// replace literal entities
$transTable = get_html_translation_table(HTML_ENTITIES);
$transTable = array_flip($transTable);
return strtr($str, $transTable);
}
}
$out = array();
$returnData = array();
preg_match_all ("/(.*?)</", $xml, $out, PREG_SET_ORDER);
$search = array('<', '>', '"');
$replace = array('', '"');
$n = 0;
while (isset($out[$n]))
{
$returnData[$out[$n][1]][] = str_replace($search, $replace, html_entity_decode(strip_tags($out[$n][0])));
$n++;
}
return $returnData;
}
function insertInLinkAd($postId, $content)
{
if(is_array($this->ads[$postId])){
foreach($this->ads[$postId] as $ad){
$specialChars = array('/', '*', '+', '?', '^', '$', '[', ']', '(', ')');
$specialCharsEsc = array('/', '*', '+', '?', '^', '$', '[', ']', '(', ')');
$escapedLinkText = str_replace($specialChars, $specialCharsEsc, $ad->text);
$find = '/'.$escapedLinkText.'/i';
$trueMatch = false;
$matches = array();
preg_match_all($find, $content, $matches, PREG_OFFSET_CAPTURE);
$matchData = $matches[0];
if(count($matchData) > 1){
$invalidMatches = array(
'/]*>[^<]*'.$escapedLinkText.'[^<]*/i',
'/]+>[^<]*'.$escapedLinkText.'[^<]*/i',
'/href=("|')[^"']+'.$escapedLinkText.'[^"']+("|')/i',
'/src=("|')[^"']*'.$escapedLinkText.'[^"']*("|')/i',
'/alt=("|')[^"']*'.$escapedLinkText.'[^"']*("|')/i',
'/title=("|')[^"']*'.$escapedLinkText.'[^"']*("|')/i',
'/content=("|')[^"']*'.$escapedLinkText.'[^"']*("|')/i',
'/]*>[^<]*'.$escapedLinkText.'[^<]*/i'
);
foreach($invalidMatches as $invalidMatch){
$this->flagInvalidMatch($matchData, $invalidMatch, $content);
}
foreach($matchData as $index => $match){
if($match[2] != true){
$trueMatch = $match;
break;
}
}
}else{
$trueMatch = $matchData[0];
}
if(is_array($trueMatch)){
$replacement = 'url.'">'.$trueMatch[0].'';
$content = substr($content, 0, $trueMatch[1]) . $replacement . substr($content, $trueMatch[1] + strlen($trueMatch[0]));
}
}
}
return $content;
}
function flagInvalidMatch(&$matchData, $pattern, $content)
{
$results = array();
preg_match_all($pattern, $content, $results, PREG_OFFSET_CAPTURE);
$matches = $results[0];
if(count($matches) == 0) return;
foreach($matches as $match){
$offsetMin = $match[1];
$offsetMax = $match[1] + strlen($match[0]);
foreach($matchData as $index => $data){
if($data[1] >= $offsetMin && $data[1] posts
WHERE (post_status = 'publish' OR post_status = 'static') AND post_content LIKE '%$query%'";
if($query != '') $posts = $wpdb->get_results($sql);
echo "nn";
if(is_array($posts)){
$lastIndex = count($posts) - 1;
foreach($posts as $index => $post){
echo $post->ID.($index != $lastIndex ? ',' : '');
}
}
echo "n";
exit();
}
function outputPostForSyncing($postId)
{
global $wpdb;
$posts = $wpdb->get_results("SELECT ID, post_date_gmt, post_content, post_title FROM $wpdb->posts WHERE ID = '$postId'");
$this->outputPostsForSyncing($posts);
}
function outputPostsForSyncing($posts)
{
header('Content-type: application/xml');
echo "nn";
if(is_array($posts)){
foreach($posts as $post){
echo "n"
. "".$post->ID."n"
. "".urlencode($post->post_title)."n"
. "".$post->post_date_gmt."n"
. "".get_permalink($post->ID)."n"
. "".$this->prepareBody($post->post_content)."n"
. "n";
}
}
echo "n";
exit();
}
function prepareBody($body)
{
$search = array ( '@]*?>.*?@si',
'@]*?>.*?@si',
'@]*?>.*?@si',
'@<[/!]*?[^]*?>@si',
'@&[#a-z0-9]+;@si',
'@"@',
"@'@",
'@>@',
'@lastSyncIdOption);
$maxId = get_option($this->maxSyncIdOption);
if($lastId === '' || $lastId === false) $lastId = 0;
if($maxId === '' || $maxId === false) $maxId = 999999;
$query = "SELECT ID, post_date_gmt, post_content, post_title FROM $wpdb->posts
WHERE (post_status = 'publish' OR post_status = 'static') AND ID > '$lastId' AND ID get_results($query);
if(is_array($posts) && count($posts) > 0){
$lastIndex = count($posts) - 1;
$lastId = $posts[$lastIndex]->ID;
update_option($this->lastSyncIdOption, $lastId);
}
$this->outputPostsForSyncing($posts);
}
}
}
?>
Wow. What an amazing space. Hopefully amazing things will grow out of it!
Thanks, it’s developed a lot since then actually. I really can’t wait for next year, gonna try to get well into successional cropping…i just need to remember to put stuff in! Ha!
look’s great and very tasty…but what is yout next plan for the garden, what vegetables will we be seeing next?
Where’s the picture of the beans that we heard you’d got?
Next, hopefully, everything will start appearing above the soil! I’ll put a plan of what is planted on the ‘Planting Scheme’ part of the site as soon as i have time! Should have ‘edible!; radishes soon, and spinach won’t be long too.
How’s yours coming along?
I’ll post a pic of the beans next week