从34,000篇帖子中的wp_postmeta中删除href标签?

时间:2015-07-10 作者:Lawrence1972

我正在使用Godaddy托管、PHP 5和Wordpress 4.2.1

我有34000多篇帖子需要删除过时的href标签。通过在页面模板中使用此代码并手动更改post\\u id,我可以删除标记,一次删除一篇文章。感谢@ialocin为wp kses添加内容。wp\\U Posteta表有347602行,但只有34788行有“simple\\u fields”行。

<?php $allowed_html = array(
        \'p\' => array(),
        \'img\' => array(
            \'alt\' => true,
            \'align\' => true,
            \'border\' => true,
            \'height\' => true,
            \'hspace\' => true,
            \'longdesc\' => true,
            \'vspace\' => true,
            \'src\' => true,
            \'usemap\' => true,
            \'width\' => true,
        ),
        \'br\' => array()
    );
?>            
<?php $source = get_post_meta(24532, \'_simple_fields_fieldGroupID_1_fieldID_1_numInSet_0\', true); ?>
<?php update_post_meta(24532, \'_simple_fields_fieldGroupID_1_fieldID_1_numInSet_0\', wp_kses ($source, $allowed_html) ); ?>

但是,我需要将此应用于数千个wp\\U Posteta行。修改后this example 从@TheDeadMedic,我可以抛出以下代码的错误,但到目前为止,它对数据库没有任何作用。

错误是:

致命错误:允许的内存大小为67108864字节,在/wp包括/wp db。php在线2204

如果我将posts\\u per\\u页面更改为-1,它似乎没有任何作用。它只是刷新页面。

<?php 
/**
 * Update All postmeta
 *
 */
$args = array(
    \'fields\'            => \'ids\', // MAGIC! Just get an array of id\'s, no objects committed to memory
    \'posts_per_page\'    => 500,  // Batch size: look at all posts
    \'post_type\'         => \'post\',
    \'date_query\'        => array( // Make sure the post is over 30 days old
        array(
            \'column\' => \'post_date_gmt\',
            \'before\' => \'1 month ago\'
        )
    ),
);
$query = new WP_Query;
$paged = 1;
$count = 0;
$total = null;
do {
    $args[\'no_found_rows\'] = isset( $total ); // No need to SQL_CALC_FOUND_ROWS on subsequent iterations
    $args[\'paged\'] = $paged++;

    $post_ids = $query->query( $args );
    update_postmeta_cache( $post_ids ); // Get all meta for this group of posts
    if ( ! isset( $total ) )
        $total = $query->found_posts;
        $count += $query->post_count;
    foreach ( $post_ids as $post_id ) {
        $allowed_html = array( // Declare tags not to be removed
            \'p\' => array(),
            \'img\' => array(
                \'alt\' => true,
                \'align\' => true,
                \'border\' => true,
                \'height\' => true,
                \'hspace\' => true,
                \'longdesc\' => true,
                \'vspace\' => true,
                \'src\' => true,
                \'usemap\' => true,
                \'width\' => true,
            ),
            \'br\' => array()
        );          
        $source = get_post_meta($post_id, \'_simple_fields_fieldGroupID_1_fieldID_1_numInSet_0\', true);
        update_post_meta($$post_id, \'_simple_fields_fieldGroupID_1_fieldID_1_numInSet_0\', wp_kses ($source, $allowed_html) );
    }
} while ( $count < $total );
?>
有人能看到有什么遗漏吗?“fields”=>“ids”,//神奇!从@TheDeadMedic需要是“post\\u id”,还是需要是foreach而不是while或other?

自动、动态、程序化或其他方式实现这一点的最佳方式是什么?

非常感谢您提供任何解决方案、线索、线索或提示。

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

最后,我能够遍历所有34788个条目,但只能根据发布日期以较小的批运行作业。这是我在页面模板上使用的最后一段代码。谢谢你@ialocin让我走上了正确的道路。这项工作已经完成,但必须有一种更好、更自动的方法来迭代帖子,而不必设置帖子日期或耗尽内存。如果你有更好的方法,请张贴在这里。

 <?php 
    /**
     * Remove href tags from postmeta by post date
     *
     */
    $args = array(
        \'post_type\' => \'post\',
        \'fields\' => \'ids\',
        \'posts_per_page\' => -1,  // Grab all Post IDs
        \'date_query\'        => array( // Set the date range of the posts you want effected
            array(
                \'after\'     => \'June 1st, 2010\',
                \'before\'    => array(
                    \'year\'  => 2012,
                    \'month\' => 12,
                    \'day\'   => 30,
                ),
                \'inclusive\' => true,
            ),
        ),
    );
    $query = new WP_Query($args);
    if ($query->have_posts()):
        foreach( $query->posts as $id ):
            $allowed_html = array( // Declare tags not to be removed
                \'p\' => array(),
                \'img\' => array(
                    \'alt\' => true,
                    \'align\' => true,
                    \'border\' => true,
                    \'height\' => true,
                    \'hspace\' => true,
                    \'longdesc\' => true,
                    \'vspace\' => true,
                    \'src\' => true,
                    \'usemap\' => true,
                    \'width\' => true,
                ),
                \'br\' => array()
            );  
        // retrieve the postmeta for the specific custom field, only if it has data.
        $source = get_post_meta($id,\'_simple_fields_fieldGroupID_1_fieldID_1_numInSet_0\', true);
        // write it back, but remove the tags with wp_kses
        update_post_meta($id, \'_simple_fields_fieldGroupID_1_fieldID_1_numInSet_0\', wp_kses ($source, $allowed_html) );
        // Wipe this post\'s meta from memory
        wp_cache_delete($id, \'post_meta\' );
        endforeach;
    endif;
    ?>

SO网友:Nicolai Grossherr

首先,我会考虑使用WordPress的wp_kses-like 函数,而不是PHPstrip_tags().

其次,使用WP_Queryget_posts() 使用fields parameter 设置为ids - 看来你不需要更多了。

第三,将循环分解为有效且可管理的步骤。因为34000多个帖子可能会达到服务器的限制-至少在处理时间方面。

例如,您可以聪明地使用posts_per_page 和/或offset 的参数WP_Query/get_posts. 或者,您可以通过处理通过设置posts_per_page-1 PHP的另一种方式。有关示例性方法,请查看以下内容answer by @TheDeadMedic 在类似的问题上。

SO网友:Vee

最快的解决方案是从数据库导出posts表,使用任何代码编辑器替换标记。对于帖子内容是未序列化的简单文本,通过这种方式,您可以在不到10分钟的时间内轻松完成所有替换。然后在db中导入sql文件。

谢谢

SO网友:performadigital

最简单的方法是通过SQL。首先备份数据库,以防出错。然后使用phpMyAdmin或类似的SQL前端运行以下SQL命令:

UPDATE wp_posts SET post_content = REPLACE(post_content, \'<br>\', \'\');
这将替换标签

<br>
所有帖子内容中没有任何内容。

如果标签在post meta中,而不是post content中,那么需要做更多的工作,因为您需要进入数据库,找到标签所在的元键。

查看wp\\uu postmeta表,并在meta\\u key列中查找上面列出的字段,然后可以运行此SQL查询:

UPDATE wp_postmeta WHERE meta_key = \'YourMetaKey\' SET meta_value = REPLACE(meta_value, \'<br>\', \'\');
对要从post content或post meta中删除的每个标记运行这些命令。

结束

相关推荐

Tags Instead of Category

UPDATE:我有一个小部件可以CHOOSE 和SHOW 来自specific category 在侧边栏中。这是代码;add_action( \'widgets_init\', \'tie_categort_posts_widget\' ); function tie_categort_posts_widget() { register_widget( \'tie_categort_posts\' ); } class tie_categort_posts ext