草庐IT

php - WordPress 从服务器导入大量图片并与帖子关联

coder 2024-04-08 原文

我想知道是否可以加快我为 wordpress 网站创建的现有导入过程?我需要从外部 xml 文件导入数据,根据该数据创建产品,然后下载图像并将它们分配给创建的产品。问题是缩略图还需要通过 wp 函数生成并关联到产品。我目前设法每秒插入 1 到 2 张图像,使用 cron 作业每 5 分钟调用一次脚本,导入限制为 120 张图像。对于 120 张图像的 block ,这相当于大约 80 到 150 秒。 Tre 问题是我需要导入大约 10000 个产品和 200000 张图片。

在 tmp 文件夹中每次大约有 1000 张图像

我目前使用的功能是:

function upload_image(){
    ini_set("memory_limit","2048M");
    add_filter('intermediate_image_sizes', function ($image_sizes){
        return array('thumbnail');
    },1000 );
    if($this->ids===false) {
        self::get_all_ids();
    }
    $upload_dir = wp_upload_dir();
    $root = $upload_dir['basedir'].DIRECTORY_SEPARATOR.'tmp'.DIRECTORY_SEPARATOR;
    $handle = opendir($root);
    $files=array();
    $propertys=array();
    $propertys_images=array();
    while (false !== ($entry = readdir($handle))) {
        if ($entry != "." && $entry != "..") {
            $tmp_data=explode('_',$entry);
            if(isset($tmp_data[1])) {
                $post_id = isset($this->ids[$tmp_data[1]]) ? $this->ids[$tmp_data[1]] : 0;
                if (!empty($post_id)) {
                    $propertys[$post_id] = $post_id;
                    $files[] = array('url' => $root . $entry, 'post_id' => $post_id, 'name' => $entry);
                }else{
                    unlink( $root . $entry);
                }
            }else{
                unlink( $root . $entry);
            }
        }
    }


    if (empty($propertys)){return'';}
    global $wpdb;
    $results = $wpdb->get_results("
        SELECT ID,post_parent, post_title
        FROM $wpdb->posts AS posts
        WHERE  post_type = 'attachment'
        AND post_parent IN(".implode(',',$propertys).")
        Order by ID asc

     ",ARRAY_A ) ;
    $set_images=array();
    foreach ($results as $r){
        $set_images[]=$r['post_title'];
        $propertys_images[$r['post_parent']][$r['ID']]=$r['ID'];
    }
    foreach ($files as $k => $d){
        if(in_array($d['name'],$set_images)){
            unset($files[$k]);
            unlink($d['url']);
        }
    }

    require_once( ABSPATH . 'wp-admin/includes/image.php' );
    foreach ($files as $id_of_i => $f){
        if($id_of_i > 120){continue;}
        $image_url = $f['name'];
        $post_id=$f['post_id'];

        $base_path=$upload_dir['basedir'].DIRECTORY_SEPARATOR.'tmp' .DIRECTORY_SEPARATOR.$image_url;

        $filename = basename( $image_url );

        if ( wp_mkdir_p( $upload_dir['path'] ) ) {
            $file = $upload_dir['path'] . '/' . $filename;
        }
        else {
            $file = $upload_dir['basedir'] . '/' . $filename;
        }

        if(file_exists($base_path)) {
            rename($base_path, $file);
            //copy($base_path, $file);
        }


        $wp_filetype = wp_check_filetype( $filename, null );

        $attachment = array(
            'post_mime_type' => $wp_filetype['type'],
            'post_title' => sanitize_file_name( $filename ),
            'post_parent' => $post_id,
            'post_content' => '',
            'post_status' => 'inherit'
        );

        $attach_id = wp_insert_attachment( $attachment, $file );
        $propertys_images[$post_id][$attach_id]=$attach_id;
        $attach_data = wp_generate_attachment_metadata( $attach_id, $file );
        wp_update_attachment_metadata( $attach_id, $attach_data );
    }
    foreach ($propertys_images as $prop_id => $images){
        $images_ids=array_values($images);
        set_post_thumbnail($prop_id, $images_ids[0]);
        update_post_meta($prop_id, '_thumbnail_id', $images_ids[0]);
        update_post_meta($prop_id, 'fave_prop_slider_image', $images_ids[0]);
        $num=get_post_meta($prop_id,'numb_of_images',true);
        delete_post_meta($prop_id,'fave_property_images');
        foreach ($images_ids as $k =>$id){
            if($k!='0'){
                add_post_meta($prop_id, 'fave_property_images', $id);
            }
        }

        if($num<=count($images_ids)){
            update_post_meta($prop_id, 'all_images_imp', 'true');
        }
    }
   exit();

}

首先我设置只生成这个图像的缩略图, 然后我收集所有产品代码(“get_all_ids()”) 然后我从 tmp 文件夹中获取所有图像并检查该 img 的产品是否存在, 然后获取我拥有其图像的产品的所有附件 然后我将图像迁移到 wp 上传路径

然后调用“wp_insert_attachment”添加基础图像, 然后使用“wp_generate_attachment_metadata”我生成一个缩略图 然后我使用“wp_update_attachment_metadata”将这些信息附加到附件

收到我添加到产品和产品库的附件 ID

我认为在这个脚本中减慢的部分是生成缩略图 有没有可能加快这个过程,或者如果你有什么建议

以目前的速度,添加所有图像大约需要 5 到 10 天

提前致谢

最佳答案

问题出在 EWWW Image Optimizer 所以你需要注意你的插件之间是否有某种优化器处于事件状态。 当我禁用插件(断开 Hook )时,插入图像的速度增加了战利品

关于php - WordPress 从服务器导入大量图片并与帖子关联,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53013083/

有关php - WordPress 从服务器导入大量图片并与帖子关联的更多相关文章

  1. ruby - 使用 ruby​​ 和 savon 的 SOAP 服务 - 2

    我正在尝试使用ruby​​和Savon来使用网络服务。测试服务为http://www.webservicex.net/WS/WSDetails.aspx?WSID=9&CATID=2require'rubygems'require'savon'client=Savon::Client.new"http://www.webservicex.net/stockquote.asmx?WSDL"client.get_quotedo|soap|soap.body={:symbol=>"AAPL"}end返回SOAP异常。检查soap信封,在我看来soap请求没有正确的命名空间。任何人都可以建议我

  2. ruby - 具有身份验证的私有(private) Ruby Gem 服务器 - 2

    我想安装一个带有一些身份验证的私有(private)Rubygem服务器。我希望能够使用公共(public)Ubuntu服务器托管内部gem。我读到了http://docs.rubygems.org/read/chapter/18.但是那个没有身份验证-如我所见。然后我读到了https://github.com/cwninja/geminabox.但是当我使用基本身份验证(他们在他们的Wiki中有)时,它会提示从我的服务器获取源。所以。如何制作带有身份验证的私有(private)Rubygem服务器?这是不可能的吗?谢谢。编辑:Geminabox问题。我尝试“捆绑”以安装新的gem..

  3. ruby - 续集在添加关联时访问many_to_many连接表 - 2

    我正在使用Sequel构建一个愿望list系统。我有一个wishlists和itemstable和一个items_wishlists连接表(该名称是续集选择的名称)。items_wishlists表还有一个用于facebookid的额外列(因此我可以存储opengraph操作),这是一个NOTNULL列。我还有Wishlist和Item具有续集many_to_many关联的模型已建立。Wishlist类也有:selectmany_to_many关联的选项设置为select:[:items.*,:items_wishlists__facebook_action_id].有没有一种方法可以

  4. ruby-on-rails - 启动 Rails 服务器时 ImageMagick 的警告 - 2

    最近,当我启动我的Rails服务器时,我收到了一长串警告。虽然它不影响我的应用程序,但我想知道如何解决这些警告。我的估计是imagemagick以某种方式被调用了两次?当我在警告前后检查我的git日志时。我想知道如何解决这个问题。-bcrypt-ruby(3.1.2)-better_errors(1.0.1)+bcrypt(3.1.7)+bcrypt-ruby(3.1.5)-bcrypt(>=3.1.3)+better_errors(1.1.0)bcrypt和imagemagick有关系吗?/Users/rbchris/.rbenv/versions/2.0.0-p247/lib/ru

  5. ruby-on-rails - s3_direct_upload 在生产服务器中不工作 - 2

    在Rails4.0.2中,我使用s3_direct_upload和aws-sdkgems直接为s3存储桶上传文件。在开发环境中它工作正常,但在生产环境中它会抛出如下错误,ActionView::Template::Error(noimplicitconversionofnilintoString)在View中,create_cv_url,:id=>"s3_uploader",:key=>"cv_uploads/{unique_id}/${filename}",:key_starts_with=>"cv_uploads/",:callback_param=>"cv[direct_uplo

  6. ruby-on-rails - Ruby on Rails - 为文本区域和图片生成列 - 2

    我是Rails的新手,所以请原谅简单的问题。我正在为一家公司创建一个网站。那家公司想在网站上展示它的客户。我想让客户自己管理这个。我正在为“客户”生成一个表格,我想要的三列是:公司名称、公司描述和Logo。对于名称,我使用的是name:string但不确定如何在脚本/生成脚手架终端命令中最好地创建描述列(因为我打算将其设置为文本区域)和图片。我怀疑描述(我想成为一个文本区域)应该仍然是描述:字符串,然后以实际形式进行调整。不确定如何处理图片字段。那么……说来话长:我在脚手架命令中输入什么来生成描述和图片列? 最佳答案 对于“文本”数

  7. ruby - 用 Ruby 编写一个简单的网络服务器 - 2

    我想在Ruby中创建一个用于开发目的的极其简单的Web服务器(不,不想使用现成的解决方案)。代码如下:#!/usr/bin/rubyrequire'socket'server=TCPServer.new('127.0.0.1',8080)whileconnection=server.acceptheaders=[]length=0whileline=connection.getsheaders想法是从命令行运行这个脚本,提供另一个脚本,它将在其标准输入上获取请求,并在其标准输出上返回完整的响应。到目前为止一切顺利,但事实证明这真的很脆弱,因为它在第二个请求上中断并出现错误:/usr/b

  8. ruby-on-rails - 在 Rails 中调试生产服务器 - 2

    您如何在Rails中的实时服务器上进行有效调试,无论是在测试版/生产服务器上?我试过直接在服务器上修改文件,然后重启应用,但是修改好像没有生效,或者需要很长时间(缓存?)我也试过在本地做“脚本/服务器生产”,但是那很慢另一种选择是编码和部署,但效率很低。有人对他们如何有效地做到这一点有任何见解吗? 最佳答案 我会回答你的问题,即使我不同意这种热修补服务器代码的方式:)首先,你真的确定你已经重启了服务器吗?您可以通过跟踪日志文件来检查它。您更改的代码显示的View可能会被缓存。缓存页面位于tmp/cache文件夹下。您可以尝试手动删除

  9. ruby - Rails 关联 - 同一个类的多个 has_one 关系 - 2

    我的问题的一个例子是体育游戏。一场体育比赛有两支球队,一支主队和一支客队。我的事件记录模型如下:classTeam"Team"has_one:away_team,:class_name=>"Team"end我希望能够通过游戏访问一个团队,例如:Game.find(1).home_team但我收到一个单元化常量错误:Game::team。谁能告诉我我做错了什么?谢谢, 最佳答案 如果Gamehas_one:team那么Rails假设您的teams表有一个game_id列。不过,您想要的是games表有一个team_id列,在这种情况下

  10. ruby - 检查是否通过 require 执行或导入了 Ruby 程序 - 2

    如何检查Ruby文件是否是通过“require”或“load”导入的,而不是简单地从命令行执行的?例如:foo.rb的内容:puts"Hello"bar.rb的内容require'foo'输出:$./foo.rbHello$./bar.rbHello基本上,我想调用bar.rb以不执行puts调用。 最佳答案 将foo.rb改为:if__FILE__==$0puts"Hello"end检查__FILE__-当前ruby​​文件的名称-与$0-正在运行的脚本的名称。 关于ruby-检查是否

随机推荐