设置带有GET POST错误的瞬变

时间:2013-10-05 作者:adnan

我有一个大的WordPress安装超过200000篇文章,具有自动发布文章的功能。我的帖子内容包含“一些HTML标签,一些文本,一些<img> 标签“。我需要删除所有<img> 标记来自特定帖子的帖子内容。所以我有这个功能来完成这项工作:

function remove_images_form_past_posts() {
    if ( get_transient(\'images_removed_from_past\') )
        return;
    $args = array( 
                \'post_type\' => \'post\', 
                \'year\' => 2013, 
                \'monthnum\' => 1, 
                \'day\' =>28,     
                \'post_status\' =>\'publish\',
                \'category\' => 30,
                \'post_author\' => 3,
                \'nopaging\' => 1
            );
    $posts = get_posts( $args );    
        if ( $posts ) {
            foreach ( $posts as $post ); setup_postdata( $post ); {
                $newcontent = preg_replace(\'/<img[^>]+\\>/i\', \'\', $post->post_content);
                $newpost = array(
                               \'ID\' => $post->ID, 
                               \'post_content\' => $newcontent
                           );
                wp_update_post($newpost);
                wp_reset_postdata();
            }
            set_transient(\'images_removed_from_past\', 60 * 60 * 24);
        }
    }
add_action(\'admin_init\',\'remove_images_form_past_posts\');
以上代码是完美的&;做这项工作,但有一个问题:不幸的是,这段代码只更新了1篇文章,尽管$args 匹配9个帖子。

我已经测试了get_posts 单独(&A);它工作得很好&;执行9个员额。我已经阻止了WP_super_cache 插件(&A);也没办法。我试图将“set\\u transient$value”从1更改为9,但没有办法。

任何想法!

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

如果您希望此功能每天运行一次,并循环浏览所有匹配的帖子(删除img 标签),我认为这应该可以做到:

<?php
function remove_images_form_past_posts() {
        if ( get_transient(\'images_removed_from_past\') )
            return;
        $args = array( 
                    \'post_type\' => \'post\', 
                    \'year\' => 2013, 
                    \'monthnum\' => 1, 
                    \'day\' =>28,     
                    \'post_status\' =>\'publish\',
                    \'category\' => 30,
                    \'post_author\' => 3,
                    \'nopaging\' => 1
                );
        $posts = get_posts( $args );    
            if ( $posts ) {
                foreach ( $posts as $post ) {
                    $newcontent = preg_replace(\'/<img[^>]+\\>/i\', \'\', $post->post_content);
                    $newpost = array(
                                   \'ID\' => $post->ID, 
                                   \'post_content\' => $newcontent
                               );
                    wp_update_post($newpost);
                }
                set_transient(\'images_removed_from_past\',true, 60 * 60 * 24);
            }
        }
add_action(\'admin_init\',\'remove_images_form_past_posts\');

SO网友:Nicolai Grossherr

您的foreach-循环错误,您通过放置; 在它背后。这就是为什么你只更新一篇帖子的原因。就这样做吧:

        foreach ( $posts as $post ) { //remove the »;«
            setup_postdata( $post ); //move this inside the loop
            $newcontent = preg_replace(\'#(<[/]?img.*>)#U\', \'\', $post->post_content);
            $newpost = array(
                           \'ID\' => $post->ID, 
                           \'post_content\' => $newcontent
                       );
            wp_update_post($newpost);
        }
        wp_reset_postdata(); //do not forget to reset postdata after the loop
我也更改了正则表达式,可能不是绝对必要的,但这一个对我来说很好。

另外添加:

global $post;
在您的功能开始时。您不必这样做,请参阅@murdaugh comment,但如果您设置并重置postdata correct,则不会有任何危害。事实上,有些情况下你必须这样做,但这与这里无关。我只是出于故障保护的原因才建议这样做的。




<小时>Disclaimer:<第二部分不是问题答案的一部分。这只是对提出的问题的进一步考虑<人力资源>Other notes:

我猜你想让你的过渡者反映哪些帖子已经被清理了。如果你有20万个帖子,这绝对有道理。在这种情况下,您应该确保您的临时名称反映了您已经清理的帖子集。像函数中这样的泛型函数无法解决此问题。瞬态名称应反映$args. 精简的代码段:

    //make your parameters variables
    $ay = \'2013\'; //year
    $am = \'1\'; //month
    $ad = \'28\'; //day
    $ac = \'30\'; //category
    $aa = \'3\'; //author

    //get your transient based on the set of variables
    if (get_transient(\'rm_img_\'.$ay.\'_\'.$am.\'_\'.$ad.\'_\'.$ac.\'_\'.$aa.\'\') )
        return;

    //use the variables in your args
    $args = array( 
        \'post_type\' => \'post\', 
        \'year\' => $ay, 
        \'monthnum\' => $am, 
        \'day\' => $ad,     
        \'post_status\' =>\'publish\',
        \'category\' => $ac,
        \'post_author\' => $aa,
        \'nopaging\' => 1
    );

    //get your transient based on the set of variables
    set_transient(\'rm_img_\'.$ay.\'_\'.$am.\'_\'.$ad.\'_\'.$ac.\'_\'.$aa.\'\', true, 0);
这不是现在的样子

这只是一个如何利用瞬间的想法,对你或其他感兴趣的人来说

结束

相关推荐

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存储,所以我猜后端存储是可插入的。这个问