web-dev-qa-db-ja.com

FirefoxのブックマークをWordPressブログに変換する方法

私もこれを思っていました。私は試してみて、数時間かけて試しましたが、ついに私は進むことができました。私はその過程でほとんどの人にとって明白ではないことをいくつか発見したので、ここでいくつかのステップを投稿します。あなたはすぐにあなた自身がテストのためにテストサーバ上でこれを設定することができるはずです。他の方法が見つかった場合は、私にお知らせください。

まず最初に、私はすべてのブックマークをいくらか整理することを望んでいました、そしてFirefox用のタグ付け拡張がいくつかありますが、それらの多くは大きすぎるように見えました。振り返ってみると、私は最初にそれらのいくつかを試してみたかもしれません。

ブックマークにタグを付けるにはdelicious.com(以前のdel.icio.us)を使用することにしました。それが最も簡単なやり方で、私が持っていた1,500のブッ​​クマークのほとんどはそのサイトで知られていたので、タグを利用することができました。あなたはFirefoxのおいしいエクステンションを使用するか、または彼らのウェブサイトに直接インポートすることができるでしょう。

彼らはAPIを持っており、その中に隠されているのはこのURLですhttp:// username:[email protected]/v1/posts/all

これで、ブックマークを、今はタグ付きでxmlファイルとして持つことができます。

次に、ここからスクリプトを使用して http://memografia.com/wordpress/delicious-to-wordpress-importer/ としてインポートします。ブログ。しかし、あなたはあなたのプラグインディレクトリにこのスクリプトを置いてそれを動作させることはできません! WordPress 3.0はインポーターのやり方を変えましたが、レガシーサポートを残しました(ただし、これはどこにも文書化されていません)。wp-adminフォルダーに 'input'というフォルダーを作成し、そこにdelicious.phpファイルをドロップする。 (これはregister_importer()関数を使用するすべてのインポータースクリプトで機能します。)

ダッシュボードに移動して[ツール]> [インポート]を見ると、[Delicious]が選択肢になっていることがわかります。ブックマークタグをカテゴリまたはタグとしてインポートすると、ブックマークごとに投稿ができます。

誰かがこれを試してみるなら、私は次に何をすべきかについてアドバイスが欲しいです。私はこれをどのように行うかを研究したので、私は自分のしおりを理解し、最も有用なものにコメントを付けることができました。私はそれを行うことができますが、誰かが物事を肉付けするための抜粋をつかむどんなプラグインについても知っているならば、私に知らせてください。ブックマークをアーカイブして、時間で簡単に並べ替えることができるようにするのは、かなりきれいです。

5
tomcat23

QUESTION(Firefox)で話題になるためには、中間ステップとしておいしいものを使うというアプローチが好ましいとは思わない。

  1. あなたはFirefoxで適用された階層的な分類法を失います(それらはあなたが物事を構造化する方法です)
  2. あなたはFirefoxに集まったようにあなたはfaviconを失います
  3. リンク間の仕切りによって追加された情報を失う
  4. あなたはFirefoxで適用されたディレクトリとURLの順序に関する情報を失います
  5. 他のブックマークのソースとは互換性がありません。他のブラウザなどURLのディレクトリ

したがって、私のアプローチは、a)FirefoxをそれぞれのブックマークをURLとして保存した "BOOKMARK"ディレクトリ構造にエクスポートすることです。 b)このブックマークディレクトリは実際の心臓部であり、他のブラウザから入力することができ、階層情報を保持し、.urlファイル内に追加のメタ情報を配置することができます。

(この段階で、私は現在のコードでデバイダエクスポートを削除しました)

WordPressからWPに配置するディレクトリ構造を通過することができます。あなたが気づくことは、現在WordPressにあるようなリンクもまた適用されたディレクトリ分類を失い(例えば階層的カテゴリがない)それ故に私はこの情報を保持するために私のリンクストレージ用のサイドテーブルを作ることにしました。その後の手順に答えてください)。

あなたが最初にFirefoxをエクスポートすることに集中したいならば、以下は必要であるかもしれません。もう一度言います。物理的なディレクトリをたどって、次にこれを読んでください。データベーステーブル(wplinks)はそのまま使用できます。

require_once("class-EdlSqliteDb.php");
require_once("class-EdlUtil.php");

class EdlFirefox {

const BOOKMARKTYPE_URL = 1;
const BOOKMARKTYPE_DIRECTORY = 2;
const BOOKMARKTYPE_DIVIDER = 3;
const FMODE = 0777;
const DIVIDER = '--------------';

var $use_cache = true;
var $dbh;

public function __construct($DbLocation, $ffRoot, $exportLocationBookmarks) 
{
    $this->mDbLocation = $DbLocation;
    $this->mRootTitle = $ffRoot;
    $this->mExportLocation = $exportLocationBookmarks;

    // database settings
    $this->dbh = new EdlSqliteDb($DbLocation);
    $this->dbh->addQ(1,"SELECT id FROM moz_bookmarks WHERE title=?");
    $this->dbh->addQ(2,"SELECT id, title, type, fk FROM moz_bookmarks WHERE parent=? ORDER BY position");
    $this->dbh->addQ(3,"SELECT content FROM moz_items_annos WHERE item_id=?");
    $this->dbh->addQ(4,"SELECT url,favicon_id FROM moz_places WHERE id=?");
    $this->dbh->addQ(5,"SELECT data, mime_type FROM moz_favicons WHERE id=?");

    // parse the content
    $this->ParseTree();     
}

/*
 * check the ff database for the the root folder folders
 *
 */
function ParseTree()
{           
    $row = $this->dbh->DbExecutePrepared(1, Array($this->mRootTitle), 'row');
    if (USE_FIREFOX_FOLDER)
    {
        $this->ParsePagesPerTree($row[0], $this->mExportLocation . '/'. FIREFOX_FOLDER .  '/');
    }
    else 
    {
        $this->ParsePagesPerTree($row[0], $this->mExportLocation . '/');
    }
    return;
}

/*
 * if a bookmark is a url then write it as a file
 *
 */
function processFFUrl($moz_bookmarks_id, $moz_bookmarks_fk, $moz_bookmarks_title, $strRootFolder)
{
    // (1.1) Get from the annotations the description of the url
    $moz_items_annos_row = $this->dbh->DbExecutePrepared(3, Array($moz_bookmarks_id), 'row');
    $moz_items_annos_description = $moz_items_annos_row[0];

    // (1.2) get the url and favicon_id from moz_places
    if ($moz_places_recordset = $this->dbh->DbExecutePrepared(4, Array($moz_bookmarks_fk), 'recordset'))
    {
        foreach ($moz_places_recordset as $moz_places_row) 
        {
            $moz_places_url        = $moz_places_row[0];
            $moz_places_favicon_id = $moz_places_row[1];
        }
    }   

    $this->getFaviconIcon($moz_places_favicon_id, $moz_places_url);

    // (1.3) create the file
    $link_url_string = "[InternetShortcut]\n";
    $link_url_string .= 'URL=' . $moz_places_url . "\n";
    $link_url_string .= 'description=' . $moz_items_annos_description . "\n";   

    if (!is_file($strRootFolder . '/'. $moz_bookmarks_title . '.url')) 
    {
        $filename = $strRootFolder . '/'. $moz_bookmarks_title . '.url';
        $fp = fopen($filename, 'w');
        fwrite($fp, $link_url_string);
        fclose($fp);
    }
}

/*
 * for each logical folder create a physical folder
 *
 */
function parsePagesPerTree($intRootId, $strRootFolder)
{
    if ($moz_bookmarks_recordset = $this->dbh->DbExecutePrepared(2, Array($intRootId), 'recordset'))
    {
        foreach ($moz_bookmarks_recordset as $moz_bookmarks_row)
        {
            $moz_bookmarks_id       = $moz_bookmarks_row[0];
            $moz_bookmarks_title    = EdlUtil::filename_safe($moz_bookmarks_row[1]);
            $moz_bookmarks_type     = $moz_bookmarks_row[2];
            $moz_bookmarks_fk       = $moz_bookmarks_row[3];
            $moz_bookmarks_url = '';
            $moz_bookmarks_favicon_id = '';

            // A bookmark can be one of three things: process (1) urls, (2) directories and (3) dividers
            if ($moz_bookmarks_type==self::BOOKMARKTYPE_URL)
            {
                $this->processFFUrl($moz_bookmarks_id, $moz_bookmarks_fk, $moz_bookmarks_title, $strRootFolder);
            } 
            elseif ($moz_bookmarks_type==self::BOOKMARKTYPE_DIRECTORY)
            {       
                $dir = $strRootFolder . '/'. $moz_bookmarks_title . '/';
                if (!file_exists($dir)) 
                {
                    if (!mkdir($dir, 0777, true)) 
                    {
                        die('Failed to create folders...');
                    }                   
                }
                $this->parsePagesPerTree($moz_bookmarks_id, $strRootFolder . '/'. $moz_bookmarks_title);
            }
            elseif ($moz_bookmarks_type==self::BOOKMARKTYPE_DIVIDER)
            {
                // todo         
            }       
        }
    }   
    return;
}   

//
function getFaviconIcon($moz_bookmarks_favicon_id, $moz_bookmarks_url)
{
    $icon_data = '';
    $moz_bookmarks_favicon = '';
    if ($moz_bookmarks_favicon_id)
    {
        if ($moz_favicons_recordset = $this->dbh->DbExecutePrepared(5, Array($moz_bookmarks_favicon_id), 'recordset'))
        {
            foreach ($moz_favicons_recordset as $moz_favicons_row)
            {
                $icon_data      = $moz_favicons_row[0];
                $icon_mime_type = $moz_favicons_row[1];
                // the following array is also defined in the google icon checker!
                $icon_type = array(  'image/png'    => 'a.png',
                                 'image/gif'    => 'a.gif',
                                 'image/x-icon' => 'a.ico',
                                 'image/jpeg'   => 'a.jpg',
                                 'image/bmp'    => 'a.bmp');                                     

                $moz_bookmarks_favicon = $icon_type[$icon_mime_type];
                // TODO reimplement echo 'warning: you should add:' . $icon_mime_type;              

                //if ('http://apps.facebook.com/frontierville/' == $moz_bookmarks_url)
                //{
                //  echo $moz_bookmarks_favicon_id . " - " . $icon_mime_type . " - " .
                //      $moz_bookmarks_favicon;
                //}
            }   
        }   
    }
    // if $moz_bookmarks_favicon = empty then provide weird name
    if ($moz_bookmarks_favicon) {
        $populair_cache = new EdlCache($moz_bookmarks_url, $moz_bookmarks_favicon);
        $obj = $populair_cache->CheckCacheData($icon_data, FILECACHE_FIREFOX, false);
    }

    // we dont want to return the data it only needs to be update
    return;         
}
 } 

私はあなたにこれをさらに一歩進めるための手がかりを与えることができると思います。

1)私が欲しかったのは、自分のブックマークを管理し、すでにそこにある情報でそれを充実させるためのより簡単な方法です。 2)Alexa、Delcious、StumbleUponなどのようなさまざまなシステムが、URLレベルで情報を提供するわけではありません。 Alexaはドメイン構造のより高いレベルの情報を提供します。 abc.def.com:あなたはランキングのためのdef.comまたはabc.def.com/whatever/rtc.phpを必要とします。 def.com/user(youtubeのように)が必要です。したがって、ドメイン構造と相対URL構造の両方が必要です。また、後でこれを表現して充実させることができるように、可能なすべてのURL(ドメインと相対の両方)の各単一ノードをデータベースのエントリとして持つ必要があります。それを表すことができるようにURLの一部。

  1. 私は公式のTLD構造をロードするクラスを書き、これを私のデータベースのルート項目として使いました。つまり、.ukはID 1を取得し、.co.ukは親ID 1を取得します。Mozillaリストとother:sourceの両方を使用しました。ソースはMozilla Public Suffix List: http:// publicsuffixです。 org / しかしそれは少し古くなっているので追加する必要があります

  2. 私はそこに公式TLDを持っているので、私はAlexaのトップ1.000.000サイトにロードするクラスを持っています。これは同じ方法でリンクします。これらの多くは一種の非公式のトップレベルのTLDです。例えば"google.com"はある国のTLDほど公式ではありませんが、それはより重要なようです。そうすることで、いくつかのパターンだけでなくいくつかの例外も発見します。あなたは大衆的なIPアドレスを見つけるでしょう。これらの各エントリは、フィールド "Alexa Ranking"を埋めます。 (パフォーマンスのために私は最初にヘルプテーブルに.csvをロードします)Alexaはあなたにパターンを見直すことを強いるのでそれは良いことです(良いテストセット)

  3. 私は自分のFirefoxデータベース(sql lite)をトラバースし、そこにあるすべてのURLを.URLとして階層ディレクトリ構造にエクスポートするクラスを書きました。それはまた、それらが.ico、.png、.gifなどであるかどうかにかかわらず、faviconをエクスポートします(下記参照)。これもデータベースに読み込まれます。私はこれをたくさん更新するので、それは1と2で説明されたデータベースと同期します(初めに私は仕切りもエクスポートしましたが、私はそれをするのをやめました)。

  4. 他のブラウザからこのディレクトリ構造にブックマークをドラッグアンドドロップするだけです。クロムから私はちょうどブラウザからその.urlファイルを提供するディレクトリにブックマークをドラッグするだけです。私が追加のプロパティを与えたURLのディレクトリ構造(h)名前の先頭に「心」が表示されます。私が特に好きなURLが1つあれば#01#が一番上に配置されます(または少なくともコードがさらに処理する方法です)。このディレクトリ構造をドロップボックスに配置しました。 Dropboxサーバーの部分になるように常に同期するようにサーバー上でコードを書く必要があります。 (サーバーのカウンターパートの私のWORDPRESSは、上記のようにブックマークを同期および更新するためにURLディレクトリ構造を常に読み取りますが、私は今ではftp syncを使用しています)

  5. ランキング(おいしい=ブックマーク数)(SU =レビュー数とページビュー数)だけでなく、TAGSとユーザーが使用する説明(なぜ必要なのか)を取得するために、delicious(MD5が必要です)とStumbleUponのクラスを書きました。他の人がすでにタグを付けている場合は、自分でタグを作成します。あなたがこれらのシステムにすることができる呼び出しの制限量を持っているのであなたはあなたのデータベースを豊かにするために時間をかけてそれを広げる必要があります。 (あなたが今おいしいに行き、リンクを調べるなら右側を見て、そしてリンクに与えられたタグの分類学についての考えを得る)

  6. Googleにはすべてのアイコンがあるわけではないので(たとえば、Facebookアプリケーションではないので)、faviconを表示するにはGoogle faviconsプロバイダ(const GOOGLE_ICON_URL = 'http://www.google.com/s2/favicons?domain=';)を使用します。 Firefoxからエクスポートしたアイコンでキャッシュを充実させます。そのためには、他よりも正しいファビコンを選択する優先システム構築が必要です。

  7. これをキャッシュするために、私はドメインがのために逆転したように見えるキャッシング構造を持っています。パーツ.com.facebook.apps.geochallengeとより深いレベルでの相対パス構造そのキャッシュ構造のそれぞれのディレクトリに、キャッシュファビコンを格納します。前回のリリースでは、おいしさとつまずきの呼びかけの結果もそこに格納していました。

これはWordPressの範囲外のようですが、実際には(grin)非常に範囲内です。組み込みリンク機能には良いメタオプションやメタテーブルがなく、階層カテゴリがないなどの制限があります。また、URLをすでに分類しているサービスが多数ある一方で、その中に情報を入力する必要があります。 (例:dmoz)それに、デフォルトのようになっているタグなどを付けます。

だからこれは私のリンクを処理するための私のWordPressサイトの「下」にあります。

呼び出し回数を少なくし、後でプラグインとしてこれを共有するために、少なくともトップ1.000.000とサイトのすべての情報を使用してこの設定を行います。私はWPのプラグインのdbにStumbleUponのプラグインを持っており、それがこれにつながった。ウェブログにある外部リンクに関する情報を提供できます。一般的なSEOに関する情報を提供するプラグインはたくさんありますが、報告や比較を示すものはありません。 「あなたの外向きリンクの何パーセントかは、どのカテゴリーに属しているか、人気があるかどうかなどです。」それはまたあなたの入ってくるリンクや出て行くリンクなどにランキングを与えます。

4
edelwater