web-dev-qa-db-ja.com

Wp-content/uploads /のカスタムディレクトリへへのWordPress添付ファイルのインポート

私がこれをどうやって解決することができるかについての私の思考プロセスを単に変えたとしても、誰かが私が解決しようとしているこの問題に光を当てることができることを望んでいます。

カスタムのCakePHPベースのCMS Webアプリケーションを、データベースをトラバースし、多数のSQLクエリを作成し、配列を作成し、最後にWordPressインポートツールを使用してインポートに必要なXMLファイルを出力することによってWordPressにインポートします。

現在、カテゴリ、タグ、投稿/ページを問題なくインポートできましたが、問題と思われるのは画像です。 CakePHPベースのCMSの画像の現在のフォーマットはimages /年/月/日/ post_id/image_name.extです。

私の知る限りでは、デフォルトのWordPressはメディアをwp-content/uploadsまたはwp-content/uploads/year/month)の中にしか格納できません。

私がしたことはCakePPHアプリディレクトリから私のWordPressのwp-content/uploadsディレクトリにすべての画像フォルダにコピーされるので、例の画像はこのパスを持つでしょう:http://localhost/wordpress_site/wp-content/uploads/2013/01/01/12345/image.jpg

私が生成している私のWordPress XMLファイルの中で、私はアップロードディレクトリの中に置いた新しい画像を参照して、attachment_urlとGIUDを上記のように設定しました。 XMLのattachment要素のシリアライズされたメタデータにファイルパスを設定することもできます。

インポート処理を実行し、WordPressの[添付ファイルのダウンロードとインポート]オプションを選択しないと、メディアをインポートできないというエラーが表示されます。

[添付ファイルのダウンロードとインポート]オプションをオンにした場合、画像は上記で指定したカスタムパス内に配置されますが、サムネイルのサイズなどに従ってサイズ変更され、画像は年/月/)内に配置されますimage.jpgpathそのため、WordPressはその(カスタム)場所でファイルを読み取っただけですが、最終パスは標準のWordPressパスに設定し、画像とその生成されたサムネイルを目的の場所に移動します。

メディアをアップロードフォルダ内のカスタムパスに配置し、インポートの実行時にそのパスを受け入れて使用するようWordPressに強制する方法を知っている人はいますか?

アクションやフックを使ってアップロードパスの構造を変更できることは理解できますが、WordPress内でのみ、またポスト/ページ/メディアマネージャを介してメディアをアップロードするときに限り、インポート中には変更できません。最後にやりたいことはインポートスクリプトをハックすることです。

任意の助け、指導、アドバイスの言葉は感謝以上になります。

3
SimonDowdles

はい、プログラムで添付ファイルを追加することで可能です。

$upl = wp_upload_dir();
$target = $upl['basedir'] . '/YOUR_CUSTOM_FOLDERS/YOUR_FILE';
$filetype = wp_check_filetype($target);

$attachment = array(
    'post_mime_type' => $filetype['type'],
    'post_title' =>  $YOUR_FILE_TITLE,
    'post_content' => '',
    'post_status' => 'inherit'
);

wp_insert_attachment( $attachment, $target, $POST_ID_TO_ATTACH_TO );

これはWordpressに$ targetに添付ファイルがあることを伝え、あなたはwp_insert_attachmentへの呼び出しの最後のパラメータでポストにそれを任意に添付することができます。

2
tobbr

私がしたのと同じジレンマに直面しているすべての人にとって、実際にはこの問題をどのように解決できるかを指示する多くのオンラインリソースがあります。解決策を見つける最善の方法は、実際にはWordPressの添付ファイルをプログラムでインポートするなどの方法で検索することであり、これによってかなりの数の解決策が生まれました。

私を正しい方向に向けるための彼の貴重な指導のための@tobbrに感謝します。私の最後の解決策は、プラグインを作成してから、古い画像とそのパスについて古いサイト(CakePHP)データベースを調べ、それらを使って添付ファイルをWordPressにインポートすることでした。

ここで考慮に入れるべき重要なポイントは、私が私のWordPressのアップロードディレクトリに古いサイトの画像ディレクトリをクローンしたということです。古い画像パスは次のとおりです。

CAKE_ROOT/app/WebRoot/images/2012/10/2/12345/image_name.jpg

12345 =データベース内の画像エントリのID(WordPressへのインポート時に添付ファイルのIDになります。そのため、上のENTIRE imagesフォルダをWordPressのアップロードディレクトリに移動したので、WordPressの画像フォルダ構造は次のようになります。

WP_ROOT/wp-content/uploads/2012/10/2/12345/image_name.jpg

あなたがプログラムで添付ファイルをインポートし始める前でさえも、あなたの画像はあなたのWordPressアップロードディレクトリ内のどこかに(どこでも)存在しなければならないことに注意することは重要です。また、インポートのために、アップロードフォルダでchmod -R 777コマンドを実行する前に、必要な権限があることを確認してください。

それから私が想像したほど複雑ではなかったプラグインを書いたので、ここでそれは同じようなタスクをする必要がある人のためのものです。

<?php
/*
Plugin Name: Image Importer
Plugin URI: 
Description:
Author: xxxxx
Version: 1.0
Author URI: 
*/

error_reporting(E_ALL);

add_action( 'admin_menu', 'sd_plugin_menu' );

function sd_plugin_menu() {
    add_options_page( 'My Plugin Options', 'My Image Importer', 'manage_options', 'sd-image-importer', 'sd_image_importer' );
}

function sd_image_importer() {
    if ( !current_user_can( 'manage_options' ) )  {
        wp_die( __( 'You do not have sufficient permissions to access this page.' ) );
    }

    echo '<div style="overflow:hidden;padding:20px;margin:20px 0 0 0;border:1px solid #ccc;font-size:14px;color:#666;">';

    if($_REQUEST['getfiles'] == 1) {

    // Make a MySQL Connection
    $con = mysqli_connect("xxx", "xxx", "xxx") or die(mysql_error());
    mysqli_select_db($con,"xxxx") or die(mysqli_error($con));

    // Retrieve all the data from the images table
    $result = mysqli_query($con,"SELECT * FROM cake_attached_images WHERE created > '2012-10-01' AND created < '2012-10-02'") or die(mysql_error($con));  

    // pre buffer empty array so as not to create one on each iteration of DB
    $files = array();

        while ($row = mysqli_fetch_array($result,MYSQL_ASSOC)) {
            $year = date('Y', strtotime($row['created']));
            $month = date('m', strtotime($row['created']));
            $day = ltrim(date('d', strtotime($row['created'])),0);
            $id = $row['id'];
            $foreign_key = $row['foreign_key'];
            $caption = $row['caption'];
            $filename = $row['filename'];

            $files[$id] = array(
                'id' => $id,
                'foreign_key' => $foreign_key,
                'path' => "$year/$month/$day/$id/$filename",
            );
        };
    }; // End if getfiles param present in URL

    if($_REQUEST['insert'] == 1){

        global $wpdb; 

        foreach($files as $file){

          $wp_filetype = wp_check_filetype(basename($wp_upload_dir['baseurl'].'/'.$file['path']), null );
          $wp_upload_dir = wp_upload_dir();

          $attachment = array(
             'guid' => $wp_upload_dir['baseurl'].'/'. $file['path'], 
             'post_mime_type' => $wp_filetype['type'],
             'post_title' => preg_replace('/\.[^.]+$/', '', basename($wp_upload_dir['baseurl'].'/'.$file['path'])),
             'post_content' => '',
             'post_status' => 'inherit',
             'post_parent' => $file['foreign_key']
          );

          // Insert attachment, newly added attachmnet ID is returned...
          $attach_id = wp_insert_attachment( $attachment, $wp_upload_dir['path'].'/'. $file['path'], $file['foreign_key'] );
          // The file MUST be included to make use of the wp_generate_attachment_metadata function below
          require_once(ABSPATH . 'wp-admin/includes/image.php');
          // Generate metadata from newly added attachment above
          $attach_data = wp_generate_attachment_metadata( $attach_id, $wp_upload_dir['path'].'/'. $file['path'] );
          // Updates atttachment metadata for newly added attachmnet based on the generated metadata above
          if(wp_update_attachment_metadata( $attach_id, $attach_data )){
            // Optional, can be sued to set the added attachmnet as the featured image on the post
            add_post_meta($file['foreign_key'], '_thumbnail_id', $attach_id, true);
            // Simple outout to indicate if attachmnet was added or not, for debugging
            echo '<span style="color:green;">Attachment successfully added for post with ID <strong>'.$file['foreign_key'].'</strong>, path of new attachment is at <strong>'.$wp_upload_dir['baseurl'].'/'.$file['path'].'</strong></span><br/>';
          }else{
            echo '<span style="color:red;">Failed to generate new attachment for post with ID <strong>'.$file['foreign_key'].'</strong></span><br/>';
          }

        }
    } // end if insert param present in URL request

    $files = null;

    echo '</div>';
}?>

AND HERE ISボーナス関数:

プラグインを書いた後に私はこれに遭遇しました、しかしあなたがほんの少ししか持っていないなら(私はインポートするために10万以上の画像を持っていた!)リモートURLから画像を取得して投稿に添付するmedia_sideload_imageと呼ばれるあなたが選んだものを見てみる価値はかなりあります。コーデックスでより多くの情報を入手: http://codex.wordpress.org/Function_Reference/media_sideload_image


私を助けてくれたWordPress Codexリソースへのリンクは以下の通りです:

  1. http://codex.wordpress.org/Function_Reference/wp_insert_attachment - 添付ファイルをプログラム的に挿入する
  2. http://codex.wordpress.org/Function_Reference/wp_update_attachment_metadata - 新しく追加された添付ファイルのメタデータの更新add_post_meta - 新しく追加された画像を注目画像として設定する場合

私を助けてくれた他の外部サイト:

  1. http://www.zdnet.com/blog/diy-it/programmatic-importing-thousands-of-featured-image-post-thumbnails-into-wordpress/118 - ZDNet
  2. http://nlb-creations.com/2012/09/26/how-to-programically-import-media-files-to-wordpress/ - NB作成
  3. プログラムでURLで画像を取得し、uploadsフォルダに保存する - WordPress Answers
  4. プログラムでローカルURLから画像の添付ファイルを作成し、注目の画像を設定する - WordPressの回答

私がそうしたように、これが誰かに役立つことを願っています。サイモン

1
SimonDowdles