sojweb
Forum Replies Created
-
Forum: Plugins
In reply to: How to do this?If you don’t find a plugin that can do this, you could probably use tags and accomplish the same thing; if you tagged articles with a specific date or event, you could then list and search them by tag. (There are plenty of plugins for doing that.)
It’s not optimal, but it might work.
Forum: Plugins
In reply to: Help with custom fields?You could do it all on the client side with JavaScript, or make a form. If you do it in JavaScript, you could either just load all the different embed codes at once, and then insert them into the
<div>whenever one is chosen from the dropdown, or you could pull the code from the server asynchronously. Making a form is probably the easiest way to go, but requires the page to reload whenever someone chooses a video.Forum: Fixing WordPress
In reply to: Use WP 2.7.1 login codeI think you can accomplish what you need through WordPress functions. I wouldn’t recommend trying to read the cookies directly. Check out these links:
http://codex.wordpress.org/Function_Reference/auth_redirect
http://codex.wordpress.org/Function_Reference/is_user_logged_in
http://codex.wordpress.org/Function_Reference/wp_redirect
http://codex.wordpress.org/WordPress_CookiesForum: Fixing WordPress
In reply to: Use WP 2.7.1 login codeI assume you want to use an external source of authentication? If so, there’s a
wp_authenticatehook you can use to authenticate a username and/or a password. Then, you can manually log the person in, bypassing WordPress’s login screen altogether; you can also auto-create accounts for people who validate. I created a plugin that lets me authenticate against an LDAP server with a custom login screen; that way, I could tie my WordPress install into a larger database of users.Forum: Installing WordPress
In reply to: …missing the MySQL extension…WordPress doesn’t support the mysqli extension; but you can modify it to do so. See this thread: http://wordpress.org/support/topic/212687
Forum: Installing WordPress
In reply to: mysqli?I should mention that the changes are marked with “SoJ Edit”… there are few unrelated edits in wp-settings.php that reflect the fact that, in PHP5, the ‘new’ operator returns a reference automatically and the syntax $wp_the_query =& new WP_Query();, is deprecated.
Also, as always, and although I’ve had no problems so far, use the code at your own risk :-). This is for WordPress 2.7.1.
Forum: Installing WordPress
In reply to: mysqli?It doesn’t, but it’s not hard to convert it over. I’m working on doing that right now, and, from what I can see, you need to edit wp-settings.php and wp-db.php:
Modified wp-settings.php:
<?php /** * Used to setup and fix common variables and include * the WordPress procedural and class library. * * You should not have to change this file and allows * for some configuration in wp-config.php. * * @package WordPress */ if ( !defined('WP_MEMORY_LIMIT') ) define('WP_MEMORY_LIMIT', '32M'); if ( function_exists('memory_get_usage') && ( (int) @ini_get('memory_limit') < abs(intval(WP_MEMORY_LIMIT)) ) ) @ini_set('memory_limit', WP_MEMORY_LIMIT); set_magic_quotes_runtime(0); @ini_set('magic_quotes_sybase', 0); /** * Turn register globals off. * * @access private * @since 2.1.0 * @return null Will return null if register_globals PHP directive was disabled */ function wp_unregister_GLOBALS() { if ( !ini_get('register_globals') ) return; if ( isset($_REQUEST['GLOBALS']) ) die('GLOBALS overwrite attempt detected'); // Variables that shouldn't be unset $noUnset = array('GLOBALS', '_GET', '_POST', '_COOKIE', '_REQUEST', '_SERVER', '_ENV', '_FILES', 'table_prefix'); $input = array_merge($_GET, $_POST, $_COOKIE, $_SERVER, $_ENV, $_FILES, isset($_SESSION) && is_array($_SESSION) ? $_SESSION : array()); foreach ( $input as $k => $v ) if ( !in_array($k, $noUnset) && isset($GLOBALS[$k]) ) { $GLOBALS[$k] = NULL; unset($GLOBALS[$k]); } } wp_unregister_GLOBALS(); unset( $wp_filter, $cache_lastcommentmodified, $cache_lastpostdate ); /** * The $blog_id global, which you can change in the config allows you to create a simple * multiple blog installation using just one WordPress and changing $blog_id around. * * @global int $blog_id * @since 2.0.0 */ if ( ! isset($blog_id) ) $blog_id = 1; // Fix for IIS, which doesn't set REQUEST_URI if ( empty( $_SERVER['REQUEST_URI'] ) ) { // IIS Mod-Rewrite if (isset($_SERVER['HTTP_X_ORIGINAL_URL'])) { $_SERVER['REQUEST_URI'] = $_SERVER['HTTP_X_ORIGINAL_URL']; } // IIS Isapi_Rewrite else if (isset($_SERVER['HTTP_X_REWRITE_URL'])) { $_SERVER['REQUEST_URI'] = $_SERVER['HTTP_X_REWRITE_URL']; } else { // Use ORIG_PATH_INFO if there is no PATH_INFO if ( !isset($_SERVER['PATH_INFO']) && isset($_SERVER['ORIG_PATH_INFO']) ) $_SERVER['PATH_INFO'] = $_SERVER['ORIG_PATH_INFO']; // Some IIS + PHP configurations puts the script-name in the path-info (No need to append it twice) if ( isset($_SERVER['PATH_INFO']) ) { if ( $_SERVER['PATH_INFO'] == $_SERVER['SCRIPT_NAME'] ) $_SERVER['REQUEST_URI'] = $_SERVER['PATH_INFO']; else $_SERVER['REQUEST_URI'] = $_SERVER['SCRIPT_NAME'] . $_SERVER['PATH_INFO']; } // Append the query string if it exists and isn't null if (isset($_SERVER['QUERY_STRING']) && !empty($_SERVER['QUERY_STRING'])) { $_SERVER['REQUEST_URI'] .= '?' . $_SERVER['QUERY_STRING']; } } } // Fix for PHP as CGI hosts that set SCRIPT_FILENAME to something ending in php.cgi for all requests if ( isset($_SERVER['SCRIPT_FILENAME']) && ( strpos($_SERVER['SCRIPT_FILENAME'], 'php.cgi') == strlen($_SERVER['SCRIPT_FILENAME']) - 7 ) ) $_SERVER['SCRIPT_FILENAME'] = $_SERVER['PATH_TRANSLATED']; // Fix for Dreamhost and other PHP as CGI hosts if (strpos($_SERVER['SCRIPT_NAME'], 'php.cgi') !== false) unset($_SERVER['PATH_INFO']); // Fix empty PHP_SELF $PHP_SELF = $_SERVER['PHP_SELF']; if ( empty($PHP_SELF) ) $_SERVER['PHP_SELF'] = $PHP_SELF = preg_replace("/(\?.*)?$/",'',$_SERVER["REQUEST_URI"]); if ( version_compare( '4.3', phpversion(), '>' ) ) { die( sprintf( /*WP_I18N_OLD_PHP*/'Your server is running PHP version %s but WordPress requires at least 4.3.'/*/WP_I18N_OLD_PHP*/, phpversion() ) ); } if ( !defined('WP_CONTENT_DIR') ) define( 'WP_CONTENT_DIR', ABSPATH . 'wp-content' ); // no trailing slash, full paths only - WP_CONTENT_URL is defined further down if ( file_exists(ABSPATH . '.maintenance') && !defined('WP_INSTALLING') ) { include(ABSPATH . '.maintenance'); // If the $upgrading timestamp is older than 10 minutes, don't die. if ( ( time() - $upgrading ) < 600 ) { if ( file_exists( WP_CONTENT_DIR . '/maintenance.php' ) ) { require_once( WP_CONTENT_DIR . '/maintenance.php' ); die(); } $protocol = $_SERVER["SERVER_PROTOCOL"]; if ( 'HTTP/1.1' != $protocol && 'HTTP/1.0' != $protocol ) $protocol = 'HTTP/1.0'; header( "$protocol 503 Service Unavailable", true, 503 ); header( 'Content-Type: text/html; charset=utf-8' ); ?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>Maintenance</title> </head> <body> <h1>Briefly unavailable for scheduled maintenance. Check back in a minute.</h1> </body> </html> <?php die(); } } // SoJ Edit: Convert to MySQLi //if ( !extension_loaded('mysql') && !file_exists(WP_CONTENT_DIR . '/db.php') ) if ( !extension_loaded('mysqli') && !file_exists(WP_CONTENT_DIR . '/db.php') ) die( /*WP_I18N_OLD_MYSQL*/'Your PHP installation appears to be missing the MySQL extension which is required by WordPress.'/*/WP_I18N_OLD_MYSQL*/ ); /** * PHP 4 standard microtime start capture. * * @access private * @since 0.71 * @global int $timestart Seconds and Microseconds added together from when function is called. * @return bool Always returns true. */ function timer_start() { global $timestart; $mtime = explode(' ', microtime() ); $mtime = $mtime[1] + $mtime[0]; $timestart = $mtime; return true; } /** * Return and/or display the time from the page start to when function is called. * * You can get the results and print them by doing: * <code> * $nTimePageTookToExecute = timer_stop(); * echo $nTimePageTookToExecute; * </code> * * Or instead, you can do: * <code> * timer_stop(1); * </code> * which will do what the above does. If you need the result, you can assign it to a variable, but * most cases, you only need to echo it. * * @since 0.71 * @global int $timestart Seconds and Microseconds added together from when timer_start() is called * @global int $timeend Seconds and Microseconds added together from when function is called * * @param int $display Use '0' or null to not echo anything and 1 to echo the total time * @param int $precision The amount of digits from the right of the decimal to display. Default is 3. * @return float The "second.microsecond" finished time calculation */ function timer_stop($display = 0, $precision = 3) { //if called like timer_stop(1), will echo $timetotal global $timestart, $timeend; $mtime = microtime(); $mtime = explode(' ',$mtime); $mtime = $mtime[1] + $mtime[0]; $timeend = $mtime; $timetotal = $timeend-$timestart; $r = ( function_exists('number_format_i18n') ) ? number_format_i18n($timetotal, $precision) : number_format($timetotal, $precision); if ( $display ) echo $r; return $r; } timer_start(); // Add define('WP_DEBUG',true); to wp-config.php to enable display of notices during development. if (defined('WP_DEBUG') and WP_DEBUG == true) { error_reporting(E_ALL); } else { // Unicode Extension is in PHP 6.0 only or do version check when this changes. if ( function_exists('unicode_decode') ) error_reporting( E_ALL ^ E_DEPRECATED ^ E_NOTICE ^ E_USER_NOTICE ^ E_STRICT ); else if ( defined( 'E_DEPRECATED' ) ) // Introduced in PHP 5.3 error_reporting( E_ALL ^ E_DEPRECATED ^ E_NOTICE ^ E_USER_NOTICE ); else error_reporting(E_ALL ^ E_NOTICE ^ E_USER_NOTICE); } // For an advanced caching plugin to use, static because you would only want one if ( defined('WP_CACHE') ) @include WP_CONTENT_DIR . '/advanced-cache.php'; /** * Stores the location of the WordPress directory of functions, classes, and core content. * * @since 1.0.0 */ define('WPINC', 'wp-includes'); if ( !defined('WP_LANG_DIR') ) { /** * Stores the location of the language directory. First looks for language folder in WP_CONTENT_DIR * and uses that folder if it exists. Or it uses the "languages" folder in WPINC. * * @since 2.1.0 */ if ( file_exists(WP_CONTENT_DIR . '/languages') && @is_dir(WP_CONTENT_DIR . '/languages') ) { define('WP_LANG_DIR', WP_CONTENT_DIR . '/languages'); // no leading slash, no trailing slash, full path, not relative to ABSPATH if (!defined('LANGDIR')) { // Old static relative path maintained for limited backwards compatibility - won't work in some cases define('LANGDIR', 'wp-content/languages'); } } else { define('WP_LANG_DIR', ABSPATH . WPINC . '/languages'); // no leading slash, no trailing slash, full path, not relative to ABSPATH if (!defined('LANGDIR')) { // Old relative path maintained for backwards compatibility define('LANGDIR', WPINC . '/languages'); } } } require (ABSPATH . WPINC . '/compat.php'); require (ABSPATH . WPINC . '/functions.php'); require (ABSPATH . WPINC . '/classes.php'); require_wp_db(); if ( !empty($wpdb->error) ) dead_db(); $prefix = $wpdb->set_prefix($table_prefix); if ( is_wp_error($prefix) ) wp_die(/*WP_I18N_BAD_PREFIX*/'<strong>ERROR</strong>: <code>$table_prefix</code> in <code>wp-config.php</code> can only contain numbers, letters, and underscores.'/*/WP_I18N_BAD_PREFIX*/); if ( file_exists(WP_CONTENT_DIR . '/object-cache.php') ) require_once (WP_CONTENT_DIR . '/object-cache.php'); else require_once (ABSPATH . WPINC . '/cache.php'); wp_cache_init(); if ( function_exists('wp_cache_add_global_groups') ) { wp_cache_add_global_groups(array ('users', 'userlogins', 'usermeta')); wp_cache_add_non_persistent_groups(array( 'comment', 'counts', 'plugins' )); } require (ABSPATH . WPINC . '/plugin.php'); require (ABSPATH . WPINC . '/default-filters.php'); include_once(ABSPATH . WPINC . '/streams.php'); include_once(ABSPATH . WPINC . '/gettext.php'); require_once (ABSPATH . WPINC . '/l10n.php'); if ( !is_blog_installed() && (strpos($_SERVER['PHP_SELF'], 'install.php') === false && !defined('WP_INSTALLING')) ) { if ( defined('WP_SITEURL') ) $link = WP_SITEURL . '/wp-admin/install.php'; elseif (strpos($_SERVER['PHP_SELF'], 'wp-admin') !== false) $link = preg_replace('|/wp-admin/?.*?$|', '/', $_SERVER['PHP_SELF']) . 'wp-admin/install.php'; else $link = preg_replace('|/[^/]+?$|', '/', $_SERVER['PHP_SELF']) . 'wp-admin/install.php'; require_once(ABSPATH . WPINC . '/kses.php'); require_once(ABSPATH . WPINC . '/pluggable.php'); wp_redirect($link); die(); // have to die here ~ Mark } require (ABSPATH . WPINC . '/formatting.php'); require (ABSPATH . WPINC . '/capabilities.php'); require (ABSPATH . WPINC . '/query.php'); require (ABSPATH . WPINC . '/theme.php'); require (ABSPATH . WPINC . '/user.php'); require (ABSPATH . WPINC . '/general-template.php'); require (ABSPATH . WPINC . '/link-template.php'); require (ABSPATH . WPINC . '/author-template.php'); require (ABSPATH . WPINC . '/post.php'); require (ABSPATH . WPINC . '/post-template.php'); require (ABSPATH . WPINC . '/category.php'); require (ABSPATH . WPINC . '/category-template.php'); require (ABSPATH . WPINC . '/comment.php'); require (ABSPATH . WPINC . '/comment-template.php'); require (ABSPATH . WPINC . '/rewrite.php'); require (ABSPATH . WPINC . '/feed.php'); require (ABSPATH . WPINC . '/bookmark.php'); require (ABSPATH . WPINC . '/bookmark-template.php'); require (ABSPATH . WPINC . '/kses.php'); require (ABSPATH . WPINC . '/cron.php'); require (ABSPATH . WPINC . '/version.php'); require (ABSPATH . WPINC . '/deprecated.php'); require (ABSPATH . WPINC . '/script-loader.php'); require (ABSPATH . WPINC . '/taxonomy.php'); require (ABSPATH . WPINC . '/update.php'); require (ABSPATH . WPINC . '/canonical.php'); require (ABSPATH . WPINC . '/shortcodes.php'); require (ABSPATH . WPINC . '/media.php'); require (ABSPATH . WPINC . '/http.php'); if ( !defined('WP_CONTENT_URL') ) define( 'WP_CONTENT_URL', get_option('siteurl') . '/wp-content'); // full url - WP_CONTENT_DIR is defined further up /** * Allows for the plugins directory to be moved from the default location. * * @since 2.6.0 */ if ( !defined('WP_PLUGIN_DIR') ) define( 'WP_PLUGIN_DIR', WP_CONTENT_DIR . '/plugins' ); // full path, no trailing slash /** * Allows for the plugins directory to be moved from the default location. * * @since 2.6.0 */ if ( !defined('WP_PLUGIN_URL') ) define( 'WP_PLUGIN_URL', WP_CONTENT_URL . '/plugins' ); // full url, no trailing slash /** * Allows for the plugins directory to be moved from the default location. * * @since 2.1.0 */ if ( !defined('PLUGINDIR') ) define( 'PLUGINDIR', 'wp-content/plugins' ); // Relative to ABSPATH. For back compat. /** * Used to guarantee unique hash cookies * @since 1.5 */ define('COOKIEHASH', md5(get_option('siteurl'))); /** * Should be exactly the same as the default value of SECRET_KEY in wp-config-sample.php * @since 2.5.0 */ $wp_default_secret_key = 'put your unique phrase here'; /** * It is possible to define this in wp-config.php * @since 2.0.0 */ if ( !defined('USER_COOKIE') ) define('USER_COOKIE', 'wordpressuser_' . COOKIEHASH); /** * It is possible to define this in wp-config.php * @since 2.0.0 */ if ( !defined('PASS_COOKIE') ) define('PASS_COOKIE', 'wordpresspass_' . COOKIEHASH); /** * It is possible to define this in wp-config.php * @since 2.5.0 */ if ( !defined('AUTH_COOKIE') ) define('AUTH_COOKIE', 'wordpress_' . COOKIEHASH); /** * It is possible to define this in wp-config.php * @since 2.6.0 */ if ( !defined('SECURE_AUTH_COOKIE') ) define('SECURE_AUTH_COOKIE', 'wordpress_sec_' . COOKIEHASH); /** * It is possible to define this in wp-config.php * @since 2.6.0 */ if ( !defined('LOGGED_IN_COOKIE') ) define('LOGGED_IN_COOKIE', 'wordpress_logged_in_' . COOKIEHASH); /** * It is possible to define this in wp-config.php * @since 2.3.0 */ if ( !defined('TEST_COOKIE') ) define('TEST_COOKIE', 'wordpress_test_cookie'); /** * It is possible to define this in wp-config.php * @since 1.2.0 */ if ( !defined('COOKIEPATH') ) define('COOKIEPATH', preg_replace('|https?://[^/]+|i', '', get_option('home') . '/' ) ); /** * It is possible to define this in wp-config.php * @since 1.5.0 */ if ( !defined('SITECOOKIEPATH') ) define('SITECOOKIEPATH', preg_replace('|https?://[^/]+|i', '', get_option('siteurl') . '/' ) ); /** * It is possible to define this in wp-config.php * @since 2.6.0 */ if ( !defined('ADMIN_COOKIE_PATH') ) define( 'ADMIN_COOKIE_PATH', SITECOOKIEPATH . 'wp-admin' ); /** * It is possible to define this in wp-config.php * @since 2.6.0 */ if ( !defined('PLUGINS_COOKIE_PATH') ) define( 'PLUGINS_COOKIE_PATH', preg_replace('|https?://[^/]+|i', '', WP_PLUGIN_URL) ); /** * It is possible to define this in wp-config.php * @since 2.0.0 */ if ( !defined('COOKIE_DOMAIN') ) define('COOKIE_DOMAIN', false); /** * It is possible to define this in wp-config.php * @since 2.6.0 */ if ( !defined('FORCE_SSL_ADMIN') ) define('FORCE_SSL_ADMIN', false); force_ssl_admin(FORCE_SSL_ADMIN); /** * It is possible to define this in wp-config.php * @since 2.6.0 */ if ( !defined('FORCE_SSL_LOGIN') ) define('FORCE_SSL_LOGIN', false); force_ssl_login(FORCE_SSL_LOGIN); /** * It is possible to define this in wp-config.php * @since 2.5.0 */ if ( !defined( 'AUTOSAVE_INTERVAL' ) ) define( 'AUTOSAVE_INTERVAL', 60 ); require (ABSPATH . WPINC . '/vars.php'); // Check for hacks file if the option is enabled if (get_option('hack_file')) { if (file_exists(ABSPATH . 'my-hacks.php')) require(ABSPATH . 'my-hacks.php'); } if ( get_option('active_plugins') && !defined('WP_INSTALLING') ) { $current_plugins = get_option('active_plugins'); if ( is_array($current_plugins) ) { foreach ($current_plugins as $plugin) { if ( '' != $plugin && 0 == validate_file($plugin) && file_exists(WP_PLUGIN_DIR . '/' . $plugin) ) include_once(WP_PLUGIN_DIR . '/' . $plugin); } } } require (ABSPATH . WPINC . '/pluggable.php'); /* * In most cases the default internal encoding is latin1, which is of no use, * since we want to use the mb_ functions for utf-8 strings */ if (function_exists('mb_internal_encoding')) { if (!@mb_internal_encoding(get_option('blog_charset'))) mb_internal_encoding('UTF-8'); } if ( defined('WP_CACHE') && function_exists('wp_cache_postload') ) wp_cache_postload(); do_action('plugins_loaded'); $default_constants = array( 'WP_POST_REVISIONS' => true ); foreach ( $default_constants as $c => $v ) @define( $c, $v ); // will fail if the constant is already defined unset($default_constants, $c, $v); // If already slashed, strip. if ( get_magic_quotes_gpc() ) { $_GET = stripslashes_deep($_GET ); $_POST = stripslashes_deep($_POST ); $_COOKIE = stripslashes_deep($_COOKIE); } // Escape with wpdb. $_GET = add_magic_quotes($_GET ); $_POST = add_magic_quotes($_POST ); $_COOKIE = add_magic_quotes($_COOKIE); $_SERVER = add_magic_quotes($_SERVER); do_action('sanitize_comment_cookies'); /** * WordPress Query object * @global object $wp_the_query * @since 2.0.0 */ // SoJ Edit //$wp_the_query =& new WP_Query(); $wp_the_query = new WP_Query(); /** * Holds the reference to @see $wp_the_query * Use this global for WordPress queries * @global object $wp_query * @since 1.5.0 */ $wp_query =& $wp_the_query; /** * Holds the WordPress Rewrite object for creating pretty URLs * @global object $wp_rewrite * @since 1.5.0 */ // SoJ Edit //$wp_rewrite =& new WP_Rewrite(); $wp_rewrite = new WP_Rewrite(); /** * WordPress Object * @global object $wp * @since 2.0.0 */ // SoJ Edit //$wp =& new WP(); $wp = new WP(); do_action('setup_theme'); /** * Web Path to the current active template directory * @since 1.5.0 */ define('TEMPLATEPATH', get_template_directory()); /** * Web Path to the current active template stylesheet directory * @since 2.1.0 */ define('STYLESHEETPATH', get_stylesheet_directory()); // Load the default text localization domain. load_default_textdomain(); /** * The locale of the blog * @since 1.5.0 */ $locale = get_locale(); $locale_file = WP_LANG_DIR . "/$locale.php"; if ( is_readable($locale_file) ) require_once($locale_file); // Pull in locale data after loading text domain. require_once(ABSPATH . WPINC . '/locale.php'); /** * WordPress Locale object for loading locale domain date and various strings. * @global object $wp_locale * @since 2.1.0 */ // SoJ Edit //$wp_locale =& new WP_Locale(); $wp_locale = new WP_Locale(); // Load functions for active theme. if ( TEMPLATEPATH !== STYLESHEETPATH && file_exists(STYLESHEETPATH . '/functions.php') ) include(STYLESHEETPATH . '/functions.php'); if ( file_exists(TEMPLATEPATH . '/functions.php') ) include(TEMPLATEPATH . '/functions.php'); /** * Runs just before PHP shuts down execution. * * @access private * @since 1.2.0 */ function shutdown_action_hook() { do_action('shutdown'); wp_cache_close(); } register_shutdown_function('shutdown_action_hook'); $wp->init(); // Sets up current user. // Everything is loaded and initialized. do_action('init'); ?>Modified wp-db.php:
<?php /** * WordPress DB Class * * Original code from {@link http://php.justinvincent.com Justin Vincent (justin@visunet.ie)} * * @package WordPress * @subpackage Database * @since 0.71 */ /** * @since 0.71 */ define('EZSQL_VERSION', 'WP1.25'); /** * @since 0.71 */ define('OBJECT', 'OBJECT', true); /** * @since {@internal Version Unknown}} */ define('OBJECT_K', 'OBJECT_K', false); /** * @since 0.71 */ define('ARRAY_A', 'ARRAY_A', false); /** * @since 0.71 */ define('ARRAY_N', 'ARRAY_N', false); /** * WordPress Database Access Abstraction Object * * It is possible to replace this class with your own * by setting the $wpdb global variable in wp-content/db.php * file with your class. You can name it wpdb also, since * this file will not be included, if the other file is * available. * * @link http://codex.wordpress.org/Function_Reference/wpdb_Class * * @package WordPress * @subpackage Database * @since 0.71 * @final */ class wpdb { /** * Whether to show SQL/DB errors * * @since 0.71 * @access private * @var bool */ var $show_errors = false; /** * Whether to suppress errors during the DB bootstrapping. * * @access private * @since {@internal Version Unknown}} * @var bool */ var $suppress_errors = false; /** * The last error during query. * * @since {@internal Version Unknown}} * @var string */ var $last_error = ''; /** * Amount of queries made * * @since 1.2.0 * @access private * @var int */ var $num_queries = 0; /** * Saved result of the last query made * * @since 1.2.0 * @access private * @var array */ var $last_query; /** * Saved info on the table column * * @since 1.2.0 * @access private * @var array */ var $col_info; /** * Saved queries that were executed * * @since 1.5.0 * @access private * @var array */ var $queries; /** * WordPress table prefix * * You can set this to have multiple WordPress installations * in a single database. The second reason is for possible * security precautions. * * @since 0.71 * @access private * @var string */ var $prefix = ''; /** * Whether the database queries are ready to start executing. * * @since 2.5.0 * @access private * @var bool */ var $ready = false; /** * WordPress Posts table * * @since 1.5.0 * @access public * @var string */ var $posts; /** * WordPress Users table * * @since 1.5.0 * @access public * @var string */ var $users; /** * WordPress Categories table * * @since 1.5.0 * @access public * @var string */ var $categories; /** * WordPress Post to Category table * * @since 1.5.0 * @access public * @var string */ var $post2cat; /** * WordPress Comments table * * @since 1.5.0 * @access public * @var string */ var $comments; /** * WordPress Links table * * @since 1.5.0 * @access public * @var string */ var $links; /** * WordPress Options table * * @since 1.5.0 * @access public * @var string */ var $options; /** * WordPress Post Metadata table * * @since {@internal Version Unknown}} * @access public * @var string */ var $postmeta; /** * WordPress User Metadata table * * @since 2.3.0 * @access public * @var string */ var $usermeta; /** * WordPress Terms table * * @since 2.3.0 * @access public * @var string */ var $terms; /** * WordPress Term Taxonomy table * * @since 2.3.0 * @access public * @var string */ var $term_taxonomy; /** * WordPress Term Relationships table * * @since 2.3.0 * @access public * @var string */ var $term_relationships; /** * List of WordPress tables * * @since {@internal Version Unknown}} * @access private * @var array */ var $tables = array('users', 'usermeta', 'posts', 'categories', 'post2cat', 'comments', 'links', 'link2cat', 'options', 'postmeta', 'terms', 'term_taxonomy', 'term_relationships'); /** * Database table columns charset * * @since 2.2.0 * @access public * @var string */ var $charset; /** * Database table columns collate * * @since 2.2.0 * @access public * @var string */ var $collate; /** * Connects to the database server and selects a database * * PHP4 compatibility layer for calling the PHP5 constructor. * * @uses wpdb::__construct() Passes parameters and returns result * @since 0.71 * * @param string $dbuser MySQL database user * @param string $dbpassword MySQL database password * @param string $dbname MySQL database name * @param string $dbhost MySQL database host */ function wpdb($dbuser, $dbpassword, $dbname, $dbhost) { return $this->__construct($dbuser, $dbpassword, $dbname, $dbhost); } /** * Connects to the database server and selects a database * * PHP5 style constructor for compatibility with PHP5. Does * the actual setting up of the class properties and connection * to the database. * * @since 2.0.8 * * @param string $dbuser MySQL database user * @param string $dbpassword MySQL database password * @param string $dbname MySQL database name * @param string $dbhost MySQL database host */ function __construct($dbuser, $dbpassword, $dbname, $dbhost) { register_shutdown_function(array(&$this, "__destruct")); if ( defined('WP_DEBUG') and WP_DEBUG == true ) $this->show_errors(); if ( defined('DB_CHARSET') ) $this->charset = DB_CHARSET; if ( defined('DB_COLLATE') ) $this->collate = DB_COLLATE; // SoJ Edit: Convert to MySQLi //$this->dbh = @mysql_connect($dbhost, $dbuser, $dbpassword, true); $this->dbh = @mysqli_connect($dbhost, $dbuser, $dbpassword); if (!$this->dbh) { $this->bail(sprintf(/*WP_I18N_DB_CONN_ERROR*/" <h1>Error establishing a database connection</h1> <p>This either means that the username and password information in your <code>wp-config.php</code> file is incorrect or we can't contact the database server at <code>%s</code>. This could mean your host's database server is down.</p> <ul> <li>Are you sure you have the correct username and password?</li> <li>Are you sure that you have typed the correct hostname?</li> <li>Are you sure that the database server is running?</li> </ul> <p>If you're unsure what these terms mean you should probably contact your host. If you still need help you can always visit the <a href='http://wordpress.org/support/'>WordPress Support Forums</a>.</p> "/*/WP_I18N_DB_CONN_ERROR*/, $dbhost)); return; } $this->ready = true; if ( $this->has_cap( 'collation' ) ) { $collation_query = ''; if ( !empty($this->charset) ) { $collation_query = "SET NAMES '{$this->charset}'"; if (!empty($this->collate) ) $collation_query .= " COLLATE '{$this->collate}'"; } if ( !empty($collation_query) ) $this->query($collation_query); } $this->select($dbname); } /** * PHP5 style destructor and will run when database object is destroyed. * * @since 2.0.8 * * @return bool Always true */ function __destruct() { return true; } /** * Sets the table prefix for the WordPress tables. * * Also allows for the CUSTOM_USER_TABLE and CUSTOM_USER_META_TABLE to * override the WordPress users and usersmeta tables. * * @since 2.5.0 * * @param string $prefix Alphanumeric name for the new prefix. * @return string Old prefix */ function set_prefix($prefix) { if ( preg_match('|[^a-z0-9_]|i', $prefix) ) return new WP_Error('invalid_db_prefix', /*WP_I18N_DB_BAD_PREFIX*/'Invalid database prefix'/*/WP_I18N_DB_BAD_PREFIX*/); $old_prefix = $this->prefix; $this->prefix = $prefix; foreach ( (array) $this->tables as $table ) $this->$table = $this->prefix . $table; if ( defined('CUSTOM_USER_TABLE') ) $this->users = CUSTOM_USER_TABLE; if ( defined('CUSTOM_USER_META_TABLE') ) $this->usermeta = CUSTOM_USER_META_TABLE; return $old_prefix; } /** * Selects a database using the current database connection. * * The database name will be changed based on the current database * connection. On failure, the execution will bail and display an DB error. * * @since 0.71 * * @param string $db MySQL database name * @return null Always null. */ function select($db) { // SoJ Edit: Convert MySQLi //if (!@mysql_select_db($db, $this->dbh)) { if (!@mysqli_select_db($this->dbh, $db)) { $this->ready = false; $this->bail(sprintf(/*WP_I18N_DB_SELECT_DB*/' <h1>Can’t select database</h1> <p>We were able to connect to the database server (which means your username and password is okay) but not able to select the <code>%1$s</code> database.</p> <ul> <li>Are you sure it exists?</li> <li>Does the user <code>%2$s</code> have permission to use the <code>%1$s</code> database?</li> <li>On some systems the name of your database is prefixed with your username, so it would be like <code>username_%1$s</code>. Could that be the problem?</li> </ul> <p>If you don\'t know how to setup a database you should <strong>contact your host</strong>. If all else fails you may find help at the <a href="http://wordpress.org/support/">WordPress Support Forums</a>.</p>'/*/WP_I18N_DB_SELECT_DB*/, $db, DB_USER)); return; } } /** * Escapes content for insertion into the database, for security * * @since 0.71 * * @param string $string * @return string query safe string */ function escape($string) { return addslashes( $string ); // Disable rest for now, causing problems /* if( !$this->dbh || version_compare( phpversion(), '4.3.0' ) == '-1' ) return mysql_escape_string( $string ); else return mysql_real_escape_string( $string, $this->dbh ); */ } /** * Escapes content by reference for insertion into the database, for security * * @since 2.3.0 * * @param string $s */ function escape_by_ref(&$s) { $s = $this->escape($s); } /** * Prepares a SQL query for safe use, using sprintf() syntax. * * @link http://php.net/sprintf See for syntax to use for query string. * @since 2.3.0 * * @param null|string $args If string, first parameter must be query statement * @param mixed $args,... If additional parameters, they will be set inserted into the query. * @return null|string Sanitized query string */ function prepare($args=null) { if ( is_null( $args ) ) return; $args = func_get_args(); $query = array_shift($args); $query = str_replace("'%s'", '%s', $query); // in case someone mistakenly already singlequoted it $query = str_replace('"%s"', '%s', $query); // doublequote unquoting $query = str_replace('%s', "'%s'", $query); // quote the strings array_walk($args, array(&$this, 'escape_by_ref')); return @vsprintf($query, $args); } /** * Print SQL/DB error. * * @since 0.71 * @global array $EZSQL_ERROR Stores error information of query and error string * * @param string $str The error to display * @return bool False if the showing of errors is disabled. */ function print_error($str = '') { global $EZSQL_ERROR; // SoJ Edit: Convert to MySQLi //if (!$str) $str = mysql_error($this->dbh); if (!$str) $str = mysqli_error($this->dbh); $EZSQL_ERROR[] = array ('query' => $this->last_query, 'error_str' => $str); if ( $this->suppress_errors ) return false; if ( $caller = $this->get_caller() ) $error_str = sprintf(/*WP_I18N_DB_QUERY_ERROR_FULL*/'WordPress database error %1$s for query %2$s made by %3$s'/*/WP_I18N_DB_QUERY_ERROR_FULL*/, $str, $this->last_query, $caller); else $error_str = sprintf(/*WP_I18N_DB_QUERY_ERROR*/'WordPress database error %1$s for query %2$s'/*/WP_I18N_DB_QUERY_ERROR*/, $str, $this->last_query); $log_error = true; if ( ! function_exists('error_log') ) $log_error = false; $log_file = @ini_get('error_log'); if ( !empty($log_file) && ('syslog' != $log_file) && !@is_writable($log_file) ) $log_error = false; if ( $log_error ) @error_log($error_str, 0); // Is error output turned on or not.. if ( !$this->show_errors ) return false; $str = htmlspecialchars($str, ENT_QUOTES); $query = htmlspecialchars($this->last_query, ENT_QUOTES); // If there is an error then take note of it print "<div id='error'> <p class='wpdberror'><strong>WordPress database error:</strong> [$str]<br /> <code>$query</code></p> </div>"; } /** * Enables showing of database errors. * * This function should be used only to enable showing of errors. * wpdb::hide_errors() should be used instead for hiding of errors. However, * this function can be used to enable and disable showing of database * errors. * * @since 0.71 * * @param bool $show Whether to show or hide errors * @return bool Old value for showing errors. */ function show_errors( $show = true ) { $errors = $this->show_errors; $this->show_errors = $show; return $errors; } /** * Disables showing of database errors. * * @since 0.71 * * @return bool Whether showing of errors was active or not */ function hide_errors() { $show = $this->show_errors; $this->show_errors = false; return $show; } /** * Whether to suppress database errors. * * @param unknown_type $suppress * @return unknown */ function suppress_errors( $suppress = true ) { $errors = $this->suppress_errors; $this->suppress_errors = $suppress; return $errors; } /** * Kill cached query results. * * @since 0.71 */ function flush() { $this->last_result = array(); $this->col_info = null; $this->last_query = null; } /** * Perform a MySQL database query, using current database connection. * * More information can be found on the codex page. * * @since 0.71 * * @param string $query * @return unknown */ function query($query) { if ( ! $this->ready ) return false; // filter the query, if filters are available // NOTE: some queries are made before the plugins have been loaded, and thus cannot be filtered with this method if ( function_exists('apply_filters') ) $query = apply_filters('query', $query); // initialise return $return_val = 0; $this->flush(); // Log how the function was called $this->func_call = "\$db->query(\"$query\")"; // Keep track of the last query for debug.. $this->last_query = $query; // Perform the query via std mysql_query function.. if ( defined('SAVEQUERIES') && SAVEQUERIES ) $this->timer_start(); // SoJ Edit: Convert to MySQLi //$this->result = @mysql_query($query, $this->dbh); $this->result = @mysqli_query($this->dbh, $query); ++$this->num_queries; if ( defined('SAVEQUERIES') && SAVEQUERIES ) $this->queries[] = array( $query, $this->timer_stop(), $this->get_caller() ); // If there is an error then take note of it.. // SoJ Edit: Convert to MySQLi //if ( $this->last_error = mysql_error($this->dbh) ) { if ( $this->last_error = mysqli_error($this->dbh) ) { $this->print_error(); return false; } if ( preg_match("/^\\s*(insert|delete|update|replace|alter) /i",$query) ) { // SoJ Edit: Convert to MySQLi //$this->rows_affected = mysql_affected_rows($this->dbh); $this->rows_affected = mysqli_affected_rows($this->dbh); // Take note of the insert_id if ( preg_match("/^\\s*(insert|replace) /i",$query) ) { // SoJ Edit: Convert to MySQLi //$this->insert_id = mysql_insert_id($this->dbh); $this->insert_id = mysqli_insert_id($this->dbh); } // Return number of rows affected $return_val = $this->rows_affected; } else { $i = 0; // SoJ Edit: Convert to MySQLi //while ($i < @mysql_num_fields($this->result)) { //$this->col_info[$i] = @mysql_fetch_field($this->result); while ($i < @mysqli_num_fields($this->result)) { $this->col_info[$i] = @mysqli_fetch_field($this->result); $i++; } $num_rows = 0; // SoJ Edit: Convert to MySQLi //while ( $row = @mysql_fetch_object($this->result) ) { while ( $row = @mysqli_fetch_object($this->result) ) { $this->last_result[$num_rows] = $row; $num_rows++; } // SoJ Edit: Convert to MySQLi //@mysql_free_result($this->result); @mysqli_free_result($this->result); // Log number of rows the query returned $this->num_rows = $num_rows; // Return number of rows selected $return_val = $this->num_rows; } return $return_val; } /** * Insert an array of data into a table. * * @since 2.5.0 * * @param string $table WARNING: not sanitized! * @param array $data Should not already be SQL-escaped * @return mixed Results of $this->query() */ function insert($table, $data) { $data = add_magic_quotes($data); $fields = array_keys($data); return $this->query("INSERT INTO $table (<code>" . implode('</code>,<code>',$fields) . "</code>) VALUES ('".implode("','",$data)."')"); } /** * Update a row in the table with an array of data. * * @since 2.5.0 * * @param string $table WARNING: not sanitized! * @param array $data Should not already be SQL-escaped * @param array $where A named array of WHERE column => value relationships. Multiple member pairs will be joined with ANDs. WARNING: the column names are not currently sanitized! * @return mixed Results of $this->query() */ function update($table, $data, $where){ $data = add_magic_quotes($data); $bits = $wheres = array(); foreach ( (array) array_keys($data) as $k ) $bits[] = "<code>$k</code> = '$data[$k]'"; if ( is_array( $where ) ) foreach ( $where as $c => $v ) $wheres[] = "$c = '" . $this->escape( $v ) . "'"; else return false; return $this->query( "UPDATE $table SET " . implode( ', ', $bits ) . ' WHERE ' . implode( ' AND ', $wheres ) ); } /** * Retrieve one variable from the database. * * This combines the functionality of wpdb::get_row() and wpdb::get_col(), * so both the column and row can be picked. * * It is possible to use this function without executing more queries. If * you already made a query, you can set the $query to 'null' value and just * retrieve either the column and row of the last query result. * * @since 0.71 * * @param string $query Can be null as well, for caching * @param int $x Column num to return * @param int $y Row num to return * @return mixed Database query results */ function get_var($query=null, $x = 0, $y = 0) { $this->func_call = "\$db->get_var(\"$query\",$x,$y)"; if ( $query ) $this->query($query); // Extract var out of cached results based x,y vals if ( !empty( $this->last_result[$y] ) ) { $values = array_values(get_object_vars($this->last_result[$y])); } // If there is a value return it else return null return (isset($values[$x]) && $values[$x]!=='') ? $values[$x] : null; } /** * Retrieve one row from the database. * * @since 0.71 * * @param string $query SQL query * @param string $output ARRAY_A | ARRAY_N | OBJECT * @param int $y Row num to return * @return mixed Database query results */ function get_row($query = null, $output = OBJECT, $y = 0) { $this->func_call = "\$db->get_row(\"$query\",$output,$y)"; if ( $query ) $this->query($query); else return null; if ( !isset($this->last_result[$y]) ) return null; if ( $output == OBJECT ) { return $this->last_result[$y] ? $this->last_result[$y] : null; } elseif ( $output == ARRAY_A ) { return $this->last_result[$y] ? get_object_vars($this->last_result[$y]) : null; } elseif ( $output == ARRAY_N ) { return $this->last_result[$y] ? array_values(get_object_vars($this->last_result[$y])) : null; } else { $this->print_error(/*WP_I18N_DB_GETROW_ERROR*/" \$db->get_row(string query, output type, int offset) -- Output type must be one of: OBJECT, ARRAY_A, ARRAY_N"/*/WP_I18N_DB_GETROW_ERROR*/); } } /** * Retrieve one column from the database. * * @since 0.71 * * @param string $query Can be null as well, for caching * @param int $x Col num to return. Starts from 0. * @return array Column results */ function get_col($query = null , $x = 0) { if ( $query ) $this->query($query); $new_array = array(); // Extract the column values for ( $i=0; $i < count($this->last_result); $i++ ) { $new_array[$i] = $this->get_var(null, $x, $i); } return $new_array; } /** * Retrieve an entire result set from the database. * * @since 0.71 * * @param string|null $query Can also be null to pull from the cache * @param string $output ARRAY_A | ARRAY_N | OBJECT_K | OBJECT * @return mixed Database query results */ function get_results($query = null, $output = OBJECT) { $this->func_call = "\$db->get_results(\"$query\", $output)"; if ( $query ) $this->query($query); else return null; if ( $output == OBJECT ) { // Return an integer-keyed array of row objects return $this->last_result; } elseif ( $output == OBJECT_K ) { // Return an array of row objects with keys from column 1 // (Duplicates are discarded) foreach ( $this->last_result as $row ) { $key = array_shift( get_object_vars( $row ) ); if ( !isset( $new_array[ $key ] ) ) $new_array[ $key ] = $row; } return $new_array; } elseif ( $output == ARRAY_A || $output == ARRAY_N ) { // Return an integer-keyed array of... if ( $this->last_result ) { $i = 0; foreach( (array) $this->last_result as $row ) { if ( $output == ARRAY_N ) { // ...integer-keyed row arrays $new_array[$i] = array_values( get_object_vars( $row ) ); } else { // ...column name-keyed row arrays $new_array[$i] = get_object_vars( $row ); } ++$i; } return $new_array; } } } /** * Retrieve column metadata from the last query. * * @since 0.71 * * @param string $info_type one of name, table, def, max_length, not_null, primary_key, multiple_key, unique_key, numeric, blob, type, unsigned, zerofill * @param int $col_offset 0: col name. 1: which table the col's in. 2: col's max length. 3: if the col is numeric. 4: col's type * @return mixed Column Results */ function get_col_info($info_type = 'name', $col_offset = -1) { if ( $this->col_info ) { if ( $col_offset == -1 ) { $i = 0; foreach( (array) $this->col_info as $col ) { $new_array[$i] = $col->{$info_type}; $i++; } return $new_array; } else { return $this->col_info[$col_offset]->{$info_type}; } } } /** * Starts the timer, for debugging purposes. * * @since 1.5.0 * * @return bool Always returns true */ function timer_start() { $mtime = microtime(); $mtime = explode(' ', $mtime); $this->time_start = $mtime[1] + $mtime[0]; return true; } /** * Stops the debugging timer. * * @since 1.5.0 * * @return int Total time spent on the query, in milliseconds */ function timer_stop() { $mtime = microtime(); $mtime = explode(' ', $mtime); $time_end = $mtime[1] + $mtime[0]; $time_total = $time_end - $this->time_start; return $time_total; } /** * Wraps fatal errors in a nice header and footer and dies. * * @since 1.5.0 * * @param string $message * @return unknown */ function bail($message) { if ( !$this->show_errors ) { if ( class_exists('WP_Error') ) $this->error = new WP_Error('500', $message); else $this->error = $message; return false; } wp_die($message); } /** * Whether or not MySQL database is minimal required version. * * @since 2.5.0 * @uses $wp_version * * @return WP_Error */ function check_database_version() { global $wp_version; // Make sure the server has MySQL 4.0 if ( version_compare($this->db_version(), '4.0.0', '<') ) return new WP_Error('database_version',sprintf(__('<strong>ERROR</strong>: WordPress %s requires MySQL 4.0.0 or higher'), $wp_version)); } /** * Whether of not the database version supports collation. * * Called when WordPress is generating the table scheme. * * @since 2.5.0 * * @return bool True if collation is supported, false if version does not */ function supports_collation() { return $this->has_cap( 'collation' ); } /** * Generic function to determine if a database supports a particular feature * @param string $db_cap the feature * @param false|string|resource $dbh_or_table the databaese (the current database, the database housing the specified table, or the database of the mysql resource) * @return bool */ function has_cap( $db_cap ) { $version = $this->db_version(); switch ( strtolower( $db_cap ) ) : case 'collation' : // @since 2.5.0 case 'group_concat' : // @since 2.7 case 'subqueries' : // @since 2.7 return version_compare($version, '4.1', '>='); break; endswitch; return false; } /** * Retrieve the name of the function that called wpdb. * * Requires PHP 4.3 and searches up the list of functions until it reaches * the one that would most logically had called this method. * * @since 2.5.0 * * @return string The name of the calling function */ function get_caller() { // requires PHP 4.3+ if ( !is_callable('debug_backtrace') ) return ''; $bt = debug_backtrace(); $caller = array(); $bt = array_reverse( $bt ); foreach ( (array) $bt as $call ) { if ( @$call['class'] == __CLASS__ ) continue; $function = $call['function']; if ( isset( $call['class'] ) ) $function = $call['class'] . "->$function"; $caller[] = $function; } $caller = join( ', ', $caller ); return $caller; } /** * The database version number * @return false|string false on failure, version number on success */ function db_version() { // SoJ Edit: Convert to MySQLi //return preg_replace('/[^0-9.].*/', '', mysql_get_server_info( $this->dbh )); return preg_replace('/[^0-9.].*/', '', mysqli_get_server_info( $this->dbh )); } } if ( ! isset($wpdb) ) { /** * WordPress Database Object, if it isn't set already in wp-content/db.php * @global object $wpdb Creates a new wpdb object based on wp-config.php Constants for the database * @since 0.71 */ $wpdb = new wpdb(DB_USER, DB_PASSWORD, DB_NAME, DB_HOST); } ?>Forum: Plugins
In reply to: WP Super Cache – Deletes all cache contentsI was just having this problem: it appears to be a bug. In wp-cache.php, in
wp_cache_clean_cache(), there’s a function call:prune_super_cache( $cache_path, true );which deletes everything in the cache directory. If you comment out this line, it will only delete the one file you clicked on. I’m not sure why that line is there and would welcome a comment from Donncha :-).
Forum: Plugins
In reply to: WP SuperCache Not CacheingI had this problem, too, but was able to get it working again. You’ve probably already tried this, but I deactivated the plugin, removed it from the plugins directory, and deleted: advanced-cache.php, the cache directory, and wp-cache-config.php from the wp-content directory. Then I just reinstalled the plugin. Hope that helps.
Forum: Plugins
In reply to: mclude/mfunc not workingGot it: had a call to an out-of-scope function that was halting execution… works great now. Thanks, guys! Though I would still like to know how or whether errors in dynamic files are logged.
Forum: Plugins
In reply to: mclude/mfunc not workingOkay, I think the problem was buried in the code I was including and didn’t have to do with Super-Cache… if a PHP error is generated by a dynamically included file, is it logged? I don’t see anything in my error logs.
Forum: Plugins
In reply to: mclude/mfunc not workingYeah, I always click the ‘Delete cache’ button.
Forum: Plugins
In reply to: mclude/mfunc not workingFor the record, I’m running it on OS X Server, Apache 2.2, and PHP 5.2. I’m also getting different behavior depending on whether I’m logged into WordPress or not (sometimes it loads the page without the include, sometimes it just halts at the include), so I’m going to do some experimenting to see if I can narrow down exactly what’s happening.
Forum: Plugins
In reply to: mclude/mfunc not workingSorry for the late reply; thanks for responding! I’ve tried disabling the super cache part but the same thing happens. The weird part is, if I open the cached file and then save it (without making any changes), then it works as it’s supposed to: the page is served from cache with the dynamic part included… but only if I change the modified date on the cached file. What might be going on? Maybe something else in the system interfering with super-cache?
Forum: Themes and Templates
In reply to: Get title for Page parentOne more try:
echo '<a href="'.get_permalink($post->ID).'">'.get_the_title($post->ID).'</a>';