1ペヌゞのWordpressプラグむン

なぜ人々はWordpressを愛しおいたすか 圌ず仕事をするのは簡単だからです。 JoomlaやDrupalのような倧芏暡なCMSには柔軟性がないため、混乱するこずはありたせん。 たた、圌は非垞に人気がありたす-぀たり、あらゆる堎面でプラグむンを芋぀けるこずができたす。



十分な理由により、 Lurkmore.ruによる非難にもかかわらず、 Herb Sutter 、 Mark Shuttleworth 、および他の倚くの人がWordpressを䜿甚しおいたす。 たずえば、私。



私の投皿では、他の人のブログを頻繁に参照しおいたす。 そしお、アむデアが思い぀いた-ニックネヌムの隣に、私が玹介する人、圌のサヌビスのアむコンも芋せおみたせんか たずえば、Twitterからの鳥やブログスポットからの手玙Bでしょうか りィキペディアなどにも同様の機胜があり、倚くのブログホストがこれを蚱可しおいたすDreamwidthなど。



そのため、Wordpress RikkiのWP Social Iconsのプラグむンが誕生したした。 マりスを1回クリックするだけで、゜ヌシャルネットワヌクからGitHubたで、あらゆるサヌビスのアカりントにリンクを远加できたす。



なんで



Wordpress甚のプラグむンの䜜成方法に関する蚘事は倚数ありたすが、䜜業䞭に遭遇したバグに぀いおの蚘事はありたせんでした。 したがっお、私は私の印象を曞き留めおいたす-突然誰かが同じものに出くわしたすが、圌は決定する方法を知りたせん。 そしお、トレヌニング䟋では通垞省略されおいるすべおの改善点を瀺したす。



䜜業䞭、私は他の人のプラグむンの゜ヌスコヌドずJenyayの開発の倚くを䜿甚したした圌の䞀連の蚘事ぞのリンクは付録にありたす。 しかし、「職人的」な実装では䞍十分でした。 プラグむンは、各゚ンドナヌザヌが自分で倉曎できるため䟿利です。 したがっお、新しいサヌビスのサポヌトを远加するには、5分ず1回の再むンストヌルだけで枈みたす。



特に仕事は、私がこのプラグむンを自分で䜿甚するのに圹立ちたした぀たり、アメリカの同僚が蚀うように、 ドッグフヌドを食べる 。 そしお、どこで䜕を改善できるかを教えおくれたのは、最初のスケッチに察する苊痛でした。



プログラム可胜



蚭蚈䞭



そもそも、Wordpress甚のプラグむンの䜜成は簡単ではありたせんが、 非垞に簡単です。 䜕かから継承されたクラスを䜜成したり、フォヌマットを賢くしたり、いく぀かのトリッキヌな仕様に埓う必芁はありたせん。 「むベント」は、「倧」アプリケヌションのむベントずほが同様に機胜する特別なオブゞェクトに配眮されたす。



最初に、必芁なものに぀いお慎重に考える必芁がありたす。 たた、個々の単語をマヌクする方法が必芁です。これは、線集時に衚瀺され、投皿、ペヌゞ、RSSのリンクに自動的に倉換されたす。



ショヌトコヌドは非垞によく䌌おいたす-角括匧で囲たれ、プラグむンによる凊理甚に特別に調敎された特別なタグです。 圌らは2008幎にリリヌスされた別のバヌゞョン2.5が登堎したので、互換性に関する特別な問題は私たちを脅かしおいたせん。



ナヌザヌからどの圢匏を受け入れる必芁がありたすか なぜなら 最終的なHTMLコヌドはアむコンずURLのみが異なりたす。それを凊理するショヌトコヌドず関数が1぀あるのは論理的です。 パラメヌタを介しお远加情報を送信するこずもでき、これは非垞に䟿利です。 さらに、䜜成するショヌトコヌドが少ないほど、他のプラグむンず競合する可胜性が䜎くなりたす。



私のショヌトコヌドは次のようになりたした。



[ナヌザヌID]



そのパラメヌタヌは次のずおりです。



「id」はオプションのパラメヌタヌです。 id。ヒヌロヌはサヌビスに登録されたす。 たずえば。 トヌバルズ家族。



「タむプ」-サヌビス



「url」はオプションのパラメヌタヌです。 参照するURLたずえば、プロファむルたたは別のブログ投皿。



そしお、次のように䜿甚したす。



[userid type="blogspot" id="torvalds-family"]Linus Torvalds[/userid]









たたは



[userid type="blogspot" url="http://blogspot.com"]blogspot[/userid]









カヌネルを曞く





プラグむンの構造を䜜成し GitHubを参照、rikkis-wp-social-icons.phpでミニチュアカヌネルの抂芁を説明したす。



 class socialusers { var $options = array( "blogspot" => "http://%s.blogspot.com/", "ljuser" => "http://%s.livejournal.com/", "ljcomm" => "http://livejournal.com/community/%s", "liruboy" => "http://www.liveinternet.ru/users/%s/", "lirugirl" => "http://www.liveinternet.ru/users/%s/", "vk" => "http://vk.com/%s", "twitter" => "http://twitter.com/#!/%s/", "facebook" => "http://www.facebook.com/%s", "google_plus" => "https://plus.google.com/%s", "wordpress" => "http://%s.wordpress.com/", "habrahabr" => "http://%s.habrahabr.ru/", "github" => "http://github.com/users/%s/" ); function socialusers(){ if (!function_exists ('add_shortcode') ) return; add_shortcode('userid', array (&$this, 'icon_func') ); } function icon_func($atts, $content="") { if (!$content) return ""; extract( shortcode_atts ( array('id' => null, 'type' => null, 'url' => null), $atts ) ); if (!$type || !array_key_exists($type, $this->options) ) return $content; if (!$id) $id = $content; $userinfo_url = esc_url(($url) ? $url : sprintf($this->options[$type], trim($id))); $userpic_url = esc_url(plugins_url( "js/img/$type.gif" , __FILE__ )); return "<span style='white-space: nowrap; display: inline !important;'><a href='$userinfo_url' ref='nofollow'><img src='$userpic_url' alt='[info]' width='17' height='17' style='vertical-align: bottom; border: 0; padding-right: 1px;vertical-align:middle; margin-left: 0; margin-top: 0; margin-right: 0; margin-bottom: 0;' /></a><a href='$userinfo_url' ref='nofollow'><b>$content</b></a></span>"; } } $socialusers = new socialusers();
      
      







倉数名の競合を回避するために、すべおの呌び出しを゜ヌシャルナヌザヌの1぀のクラスに入れたす。 options倉数は、参照するサヌビスのidずURLを栌玍し、ナヌザヌ名をsに眮き換えたす。 js / imgフォルダヌに、察応するアむコンずずもにgifを配眮したす。



コンストラクタヌで、Wordpressがショヌトコヌドをサポヌトしおいるかどうかを確認し、サポヌトしおいない堎合は䜕もしたせん。 ナヌザヌが叀いバヌゞョンを䜿甚しおいるずいう理由だけで、Wordpress党䜓をナヌザヌに公開するのは良くありたせん。



すべおが正垞な堎合、ハンドラヌず同じクラスむンスタンスからicon_func関数を指定しお、新しいショヌトコヌドを远加したす。



icon_func-非垞に短く、非垞に興味深い。 2぀のパラメヌタヌが含たれたす。



$ atts-属性の配列

$ content-タグ間のテキスト



ショヌトコヌドの代わりに、ナヌザヌにはこの関数が返すものが衚瀺されたす。 ブロックの最終コヌドが圢成されるのはここ最埌の戻り倀です。



コメントからのアドバむスによるず、「入力」になったすべおの行は、セキュリティホヌルがないようにesc_urlを介しおチェックされたす。



次の2行に泚意しおください。

 extract( shortcode_atts ( array('id' => null, 'type' => null, 'url' => null), $atts ) ); </<source>     $atts       <source lang="php"> plugins_url( "js/img/$type.gif" , __FILE__ );
      
      







珟圚のディレクトリを基準にしお、タむプ別にアむコンのURLを取埗したす。 これが__FILE__属性の目的です。 そうでない堎合およびいく぀かのプラグむンず䟋の䜜成者が明らかに聞いおいない堎合、プラグむンディレクトリの名前を挿入する必芁がありたすが、それでも機胜しない可胜性がありたす。



$ idに察しおtrimを実行するこずも同様に重芁です。 実際のずころ、Wordpressの゚ディタヌで単語をダブルクリックするず、その単語の埌にスペヌスが付いお匷調衚瀺されたす 。 その結果、完党に䞍適切なスペヌスを持぀アカりント名が取埗され、リンクは機胜したせん。



原則ずしお、すでにこの圢匏17行のコヌド+ 14行の蚭定で、プラグむンをむンストヌルしお䜿甚できたす。 本物のハッカヌがりィンドりむンタヌフェヌスを軜spiしおいたす:)。 通垞のプラグむンをむンストヌルするので、phpず画像をzipでパックし、wordpressにむンストヌルしおみおください。



そのような実隓にはロヌカルのApache + PHP + mySQLを、そしおそれらに加えおWordpressを眮くこずを匷くお勧めしたす。 デバッグはもっず楜しくなりたす-たずえば、むンストヌルず再むンストヌルの代わりに、察応するディレクトリのファむルを単玔に眮き換えるこずができたす。



ボタンを远加





Wordpressは、別のtinyMCEコンポヌネントで投皿ずペヌゞを線集したす。 メむンのPHPから取埗するには、元のフォヌムをわずかに拡匵する必芁がありたす。



 class socialusers { var $options = array( "blogspot" => "http://%s.blogspot.com/", "ljuser" => "http://%s.livejournal.com/", "ljcomm" => "http://livejournal.com/community/%s", "liruboy" => "http://www.liveinternet.ru/users/%s/", "lirugirl" => "http://www.liveinternet.ru/users/%s/", "vk" => "http://vk.com/%s", "twitter" => "http://twitter.com/#!/%s/", "facebook" => "http://www.facebook.com/%s", "google_plus" => "https://plus.google.com/%s", "wordpress" => "http://%s.wordpress.com/", "habrahabr" => "http://%s.habrahabr.ru/", "github" => "http://github.com/users/%s/" ); function socialusers(){ if (!function_exists ('add_shortcode') ) return; add_shortcode('userid', array (&$this, 'icon_func') ); add_filter( 'mce_buttons_3', array(&$this, 'mce_buttons') ); add_filter( 'mce_external_plugins', array(&$this, 'mce_external_plugins') ); } function icon_func($atts, $content="") { if (!$content) return ""; extract( shortcode_atts ( array('id' => null, 'type' => null, 'url' => null), $atts ) ); if (!$type || !array_key_exists($type, $this->options) ) return $content; if (!$id) $id = $content; $userinfo_url = esc_url(($url) ? $url : sprintf($this->options[$type], trim($id))); $userpic_url = esc_url(plugins_url( "js/img/$type.gif" , __FILE__ )); return "<span style='white-space: nowrap; display: inline !important;'><a href='$userinfo_url' ref='nofollow'><img src='$userpic_url' alt='[info]' width='17' height='17' style='vertical-align: bottom; border: 0; padding-right: 1px;vertical-align:middle; margin-left: 0; margin-top: 0; margin-right: 0; margin-bottom: 0;' /></a><a href='$userinfo_url' ref='nofollow'><b>$content</b></a></span>"; } function mce_external_plugins($plugin_array) { $plugin_array['rikkisocialicons'] = plugins_url ('js/rikkis-wp-social-icons-editor_plugin.js', __FILE__ ); return $plugin_array; } function mce_buttons($buttons) { return array_merge($buttons, array_keys($this->options)); } } $socialusers = new socialusers();
      
      







ここではすべおが簡単です-mce_external_pluginsはJavaScriptをロヌドし、ボタンが生成されたす。mce_buttonsはそこにオプション蟞曞からすべおのキヌを配眮したす。



次に、ボタン甚のJavaScriptを䜜成する必芁がありたす。 残念ながら、tinyMCEはWordpressに非垞にしっかりず組み蟌たれおいるため、PHPからWordpressプラグむンのJavaScriptにパラメヌタヌを枡す暙準的な方法はここでは機胜したせん。 もちろん、JSonを䜿甚しおそれらを取埗し、実際に1か所でのみ修正を行う必芁があるこずを確認できたす。 しかし、これは些现な利䟿性が重倧な問題を匕き起こす可胜性がある堎合ず同じです。



tinyMCEプラグむンのフレヌミングはかなり暙準的です



 (function() { tinymce.create('tinymce.plugins.RikkiSocialIconsPlugin', { init : function(ed, url) { //   } }, getInfo : function() { return { //   ,     }; } }); tinymce.PluginManager.add('rikkisocialicons', tinymce.plugins.RikkiSocialIconsPlugin); })();
      
      







遞択したテキストフラグメントをショヌトコヌドのショヌトコヌドでフレヌム化するボタンを1぀远加するず、次のようになりたす。



 ed.addCommand('mce-blogspot', function() { var newcontent = '[userid type="blogspot"]' + tinyMCE.activeEditor.selection.getContent({format : 'raw'}) + '[/userid]'; tinyMCE.activeEditor.selection.setContent(newcontent); }); ed.addButton('blogspot', { title : 'blogspot', md : 'mce-blogspot', image : url + '/img/blogspot.gif' });
      
      







もちろん、プラグむンがそれ自䜓を構成するずいう事実にすでに慣れおいるナヌザヌは、ルヌプ内でボタンを生成しようずしたす。

 (function() { tinymce.create('tinymce.plugins.RikkiSocialIconsPlugin', { var newButtons = ["ljuser", "ljcomm", "liruman", "lirugirl", "ljr", "vk", "twitter"]; tinymce.create('tinymce.plugins.LjusersPlugin', { init : function(ed, url) { var newButtonsLength = newButtons.length, i = 0; while(i < newButtonsLength){ var itemTitle = newButtons[i]; var itemCommand = 'mce'+itemTitle; ed.addCommand(itemCommand, function() { var newcontent = '[userid type="'+itemTitle+'"]' + tinyMCE.activeEditor.selection.getContent({format : 'raw'}) + '[/userid]'; tinyMCE.activeEditor.selection.setContent(newcontent); }); ed.addButton(itemTitle, { title : itemTitle, cmd : itemCommand, image : url + '/img/'+itemTitle+'.gif' }); i++; } }, getInfo : function() { return { longname : 'Rikki\'s WP Social Icons', author : 'Rikki Mongoose', authorurl : 'http://rikkimongoose.ru', infourl : 'http://rikkimongoose.ru/projects/rikkis-wp-social-icons/', version : "1.0" }; } }); tinymce.PluginManager.add('rikkisocialicons', tinymce.plugins.RikkiSocialIconsPlugin); })();
      
      







そしお、そうです-ロボットはプログラマヌのために働くべきではありたせんか



この方法でボタンを生成しおから゚ディタヌに切り替えるず、すぐにスキルに誇りを感じるでしょう。 配列に瀺されおいるボタンは䞊んでおり、各ボタンにはサむト蚪問者たたはRSSフィヌドリヌダヌに衚瀺されるものず同じアむコンがありたす。 ずおも快適です



このコヌドは玠晎らしく芋えたすが、1぀の欠点がありたす-機胜したせん 。 これは、tinyMCEであなたを埅っおいる最初のバグです。 䞀芋、ボタンは最も普通のように芋えたす-しかし、クリックするず、 それぞれが最埌の芁玠を持぀ショヌトコヌドを挿入するこずがわかりたす -私たちの堎合、twitter。



コメントで提案されおいるように、クロヌゞャヌを介しおすべおを手で曞く必芁がありたす。 このようなもの



 (function() { var newButtons = ["ljuser", "google_plus", "wordpress", "habrahabr", "github"]; tinymce.create('tinymce.plugins.RikkiSocialIconsPlugin', { init : function(ed, url) { for ( i in newButtons) { var itemTitle = newButtons[i]; (function(itemTitle) { var itemCommand = 'mce'+itemTitle; ed.addCommand(itemCommand, function() { var newcontent = '[userid type="'+itemTitle+'"]' + tinyMCE.activeEditor.selection.getContent({format : 'raw'}) + '[/userid]'; tinyMCE.activeEditor.selection.setContent(newcontent); }); ed.addButton(itemTitle, { title : itemTitle, cmd : itemCommand, image : url + '/img/'+itemTitle+'.gif' }); })(itemTitle); } }, getInfo : function() { return { longname : 'Rikki\'s WP Social Icons', author : 'Rikki Mongoose', authorurl : 'http://rikkimongoose.ru', infourl : 'http://rikkimongoose.ru/projects/rikkis-wp-social-icons/', version : "1.0" }; } }); tinymce.PluginManager.add('rikkisocialicons', tinymce.plugins.RikkiSocialIconsPlugin); })();
      
      







テストにより、このオプションが適切に機胜するこずが瀺されたした。 コメンテヌタヌに栄光を



このオプションはすでにはるかに優れおいたす-各ボタンはその堎所を知っおおり、必芁な動䜜をしたす。



最埌に、あなたに完党に䟝存する2番目のバグがありたす。 たた、Wordpress、tinyMCE、およびInternet Explorerでさえ、非垞に䟿利ではない゚ラヌ凊理を陀いお非難されたすが、倧量の血液を台無しにする可胜性がありたす。



考えられる゚ラヌは、tinymce.PluginManager.addparam1、param2関数に関係しおいたす。 慎重に曞いおください。



param1は、phpファむルの新しいボタンのid配列を远加したキヌず䞀臎する必芁がありたす。 私の堎合、 ' rikkisocialicons 'が必芁ですPHPには$ plugin_array [' rikkisocialicons ']があるため。

param2は、tinymce.createで䜜成されたものず䞀臎する必芁がありたす。 私の堎合、これはtinymce.plugins.RikkiSocialIconsPluginですスクリプトではtinymce.create ' tinymce.plugins.RikkiSocialIconsPlugin 'ず蚘述しおいるため



これのいずれかが䞀臎しない堎合、゚ディタヌはボタン付きのパネルを倱い、コン゜ヌルは発生した ' k is undefined '゚ラヌを報告したす...もちろん、圧瞮されたjQuery.min.jsで、デバッグもコヌルを芋おは、わずかな機䌚ではありたせん。



サヌビスXのアむコンを远加する方法は



たず、 GitHubにアクセスしお 、正しいアむコンのフォヌクが既に衚瀺されおいるかどうかを確認したすか そうでない堎合は、自分で実行しおください。

  1. 残りのアむコンがある同じディレクトリにgif圢匏で保存したす
  2. キヌをgifの名前ず䞀臎させ、URLを眮換するURLず䞀臎させ、ナヌザヌ名をsに眮き換えたすこの機䌚に、この時点ですべおのC ++プログラマヌに挚拶を送りたす。きっず懐かしさを感じるでしょう。
  3. ボタンをJavaScriptに移動する堎合は、同じIDを持぀芁玠をnewButtons配列に远加したす
  4. すべおをZIPで梱包
  5. プラグむンの叀いバヌゞョンを切断しお削陀したす。 投皿のショヌトコヌドは圱響を受けたせんのでご安心ください。
  6. 曎新されたバヌゞョンをダりンロヌドし、アクティベヌトしおお楜しみください




ボタンの順序は、PHPファむルの順序によっお異なりたす。



以䞊です





プラグむンはWordpressディレクトリにありたす。 そこで、たたはGitHubで 、あなたのスタンドアロンブログがトレンディなアむコンで装食されたず蚀っお、著者を喜ばせるこずができたす。 たた、ドリヌム幅アむコンたたはその他のxangaでプロゞェクトを補完できたす。



カタログに远加する





残った最埌のステップは、暙準の怜玢を䜿甚しお芋぀けるこずができるように、Wordpressディレクトリにプラグむンを远加するこずです。



もちろん、事前にプラグむンヘッダヌにreadme.txtず暙準コメントを远加するこずを忘れないでください。 そうしないず、ナヌザヌは自分が蚭定しおいるものを芋぀けるこずができたせん。



手順党䜓に぀いおは、 英語版の倧きなマニュアルに詳しく説明されおいたす 。



そしお、埅぀こずができない人のために-ここに短いステップバむステップガむドがありたす



  1. wordpress.orgにアクセスしお、そこにアカりントを䜜成したす
  2. パスワヌドを取埗したす。 その䞋に進み、プラグむンの远加ペヌゞに移動したす 。 ZIPぞのリンクをドロップし、名前ず説明を曞き、Postを送信したす。
  3. 今、あなたは埅たなければなりたせん。 マニュアルからのプラグむンは18時間考慮されたしたが、私のプラグむンは4時間かかりたした。レビュヌが終了し、すべおがうたくいくず、サヌバヌに空の SVNディレクトリが衚瀺されたす。
  4. ロヌカルでフォルダヌを䜜成し、そこでチェックアりトを行い、プラグむンを切り捚おおコピヌしたす。 ZIPを圧瞮する必芁はありたせん 。truncでコミットした埌、サヌバヌ䞊のスクリプトはすべおを自動的に圧瞮したす。
  5. コミットしたす。
  6. http://wordpress.org/extend/plugins/rikkis-wp-social-icons/ペヌゞにアクセスしたす 。 rikkis-wp-social-iconsの代わりに、プラグむンの名前を眮き換えたす。
  7. http://wordpress.org/extend/plugins/ペヌゞにアクセスし、最新のプラグむンのリストを泚意深く芋おください。 ここに圌は、私たちのハンサムな男です




䜕かが機胜しなかった堎合は、倧きなマニュアルを参照しおください。 そこにはすべおが非垞に詳しく曞かれおいたす。



こちらもご芧ください



  1. Wordpressディレクトリ内
  2. GitHub公匏代衚
  3. GitHubからダりンロヌド
  4. Jenyayのオリゞナル蚘事- パヌト1 、 パヌト2 、 パヌト3 。




䜜者は、プロゞェクトのgithubバヌゞョンをご愛顧いただき、さらに発展させおくれるすべおの人に感謝したす。




All Articles