获取现有瞬变的列表

时间:2013-06-15 作者:Shaun

自从我发现它们以来,我一直在WordPress中大量使用瞬态,但是为了确保我的网站在编辑或创建帖子时能够正确更新,我添加了一个功能来删除帖子保存时的瞬态。

这很好,但是我需要保留一个我在整个站点创建的所有瞬态的列表,然后在我的函数中按名称提及每个瞬态。

当我自动命名瞬态时,这尤其麻烦,例如,一些瞬态是根据其帖子标题命名的。

WordPress中是否有方法获取当前在站点上创建的所有瞬态的列表?我想在保存后清除它们。我希望这样做的同时避免直接删除数据库条目(即我希望使用delete\\u transient()函数,而不仅仅是直接删除数据库中的所有瞬态)。

4 个回复
最合适的回答,由SO网友:fuxia 整理而成

db查询如下所示:

SELECT `option_name` AS `name`, `option_value` AS `value`
FROM  $wpdb->options
WHERE `option_name` LIKE \'%transient_%\'
ORDER BY `option_name`
要按功能(现场瞬态、超时)对结果进行排序,请使用以下功能:

add_action( \'shutdown\', function(){

    global $wpdb;
    $sql = "SELECT `option_name` AS `name`, `option_value` AS `value`
            FROM  $wpdb->options
            WHERE `option_name` LIKE \'%transient_%\'
            ORDER BY `option_name`";

    $results = $wpdb->get_results( $sql );
    $transients = array();

    foreach ( $results as $result )
    {
        if ( 0 === strpos( $result->name, \'_site_transient_\' ) )
        {
            if ( 0 === strpos( $result->name, \'_site_transient_timeout_\') )
                $transients[\'site_transient_timeout\'][ $result->name ] = $result->value;
            else
                $transients[\'site_transient\'][ $result->name ] = maybe_unserialize( $result->value );
        }
        else
        {
            if ( 0 === strpos( $result->name, \'_transient_timeout_\') )
                $transients[\'transient_timeout\'][ $result->name ] = $result->value;
            else
                $transients[\'transient\'][ $result->name ] = maybe_unserialize( $result->value );
        }
    }
    print \'<pre>$transients = \' . esc_html( var_export( $transients, TRUE ) ) . \'</pre>\';
});
现在得到一个数组,由具有未序列化值的瞬态函数分隔。

示例输出:

$transients = array (
  \'site_transient\' => 
  array (
    \'_site_transient_browser_0f2bbce5647f9c092edea85f1b5d9145\' => 
    array (
      \'platform\' => \'Windows\',
      \'name\' => \'Opera\',
      \'version\' => \'12.02\',
      \'update_url\' => \'http://www.opera.com/\',
      \'img_src\' => \'http://s.wordpress.org/images/browsers/opera.png\',
      \'img_src_ssl\' => \'https://wordpress.org/images/browsers/opera.png\',
      \'current_version\' => \'11.64\',
      \'upgrade\' => false,
      \'insecure\' => false,
    ),
    \'_site_transient_browser_4155da8a3756e08080a06133476ef1fd\' => 
    array (
      \'platform\' => \'Windows\',
      \'name\' => \'Firefox\',
      \'version\' => \'19.0\',
      \'update_url\' => \'http://www.firefox.com/\',
      \'img_src\' => \'http://s.wordpress.org/images/browsers/firefox.png\',
      \'img_src_ssl\' => \'https://wordpress.org/images/browsers/firefox.png\',
      \'current_version\' => \'16\',
      \'upgrade\' => false,
      \'insecure\' => false,
    ),
  ),
  \'site_transient_timeout\' => 
  array (
    \'_site_transient_timeout_browser_0f2bbce5647f9c092edea85f1b5d9145\' => \'1352809256\',
    \'_site_transient_timeout_browser_4155da8a3756e08080a06133476ef1fd\' => \'1366603648\',
  ),
  \'transient\' => 
  array (
    \'_transient_feed_mod_46583134dd8a90321b20eb41cdeb134c\' => \'1366089834\',
    \'_transient_feed_mod_57bc725ad6568758915363af670fd8bc\' => \'1352920456\',
    \'_transient_plugins_delete_result_1\' => \'1\',
  ),
  \'transient_timeout\' => 
  array (
    \'_transient_timeout_feed_46583134dd8a90321b20eb41cdeb134c\' => \'1366133033\',
    \'_transient_timeout_feed_57bc725ad6568758915363af670fd8bc\' => \'1352963656\',
  ),
)

SO网友:Wyck

您可以使用以下方式查询数据库中的所有瞬态:

global $wpdb;

// sorry about format I hate scrollbars in answers.
$your_transients = $wpdb->get_results(
             "SELECT option_name AS name, option_value AS value FROM $wpdb->options 
              WHERE option_name LIKE \'_transient_%\'"
          );
或者你可以安装这个插件。

http://wordpress.org/plugins/debug-bar-transients/

SO网友:JMau

您可以使用the class wpdb 要在DB中进行查询以获取此信息,请执行以下操作:

$query = "
SELECT * 
FROM wp_options
WHERE option_name LIKE  \'_transient_%\'
";

EDIT: use prepare() method if you choose to make query in database through wpdb

SO网友:Milo

如果您没有维护列表,那么就没有列表。Core也使用瞬变,所以您需要某种方法来识别自己的瞬变,并使用某种独特的前缀。然后可以使用SQL查询将它们全部删除,如:

"DELETE FROM $wpdb->options WHERE `option_name` LIKE (\'%YOUR-IDENTIFIER%\')"
我不知道这到底是不是个好主意。您可以安全地将它们全部删除,并强制core和所有插件重新创建它们的瞬态,但这可能是一个巨大的负载,具体取决于创建它们所涉及的内容。

结束

相关推荐

Transients API and multisite

我们正在使用Atlas HTML站点地图插件,该插件使用transients API缓存站点地图,调用如下:set_transient( \'dmac_html_sitemap\', $output, 60*60*24*7 ); 现在,我们还有一个多站点设置,我想知道瞬态存储在哪里,WP multisite是否将它们分开。它将选项分开,因为每个站点(博客)都有自己的DB表前缀(例如wp\\U 29\\U选项)。我在某个地方读到,瞬态可以用memcached存储,所以我猜后端存储是可插入的。这个问