ホームページ > 記事 > CMS チュートリアル > WordPress の強化: 改善された API とライブラリを構築する
ウェブサイト、電話番号、地下鉄の路線図など、私たちが触れるものすべてが注意深くデザインされているように感じます。サーモスタット、煙感知器、車のダッシュボードなど、私たちが当たり前だと思っていたものでも、今ではユーザー エクスペリエンスが注意深く扱われています。
デザインは単なる見た目と操作感を超えたものです。ユーザーがデバイス/ツール/画面/オブジェクトと対話するために必要なさまざまな方法も考慮する必要があります。
これはプログラミングにも当てはまります。
プログラミング言語は広大で複雑な世界です。多くのプログラミング愛好家が「単純すぎる」と考える PHP でさえ、実際には非常に一貫性のない方法で動作する、関数とクラスのかなり複雑な組み合わせです。
長年にわたり、構文、メソッド、および命名は、何百万もの異なるユーザーやアプリケーションにわたって進化してきました。ほとんどの場合、内部の基礎となる構造が反映される傾向がありますが、必ずしもユーザーが希望する方法で使用できるわけではありません。
2006 年頃に私が JavaScript を書き始めたとき、状況は混乱していました。特定のクラスのタグを見つけて DOM 内で移動する方法は次のとおりです:
リーリー ###仕上げる!jQuery を使用すると、JavaScript が再び楽しくなります。 2000年代後半、その影響は非常に大きかったので、父がウォール・ストリート・ジャーナルで読んだ「何か奇妙なこと」について私に尋ねたのを覚えています。しかし、その大きな効果にもかかわらず、jQuery は JavaScript に「新しい機能」を追加しません。開発者がしなければならないことを非常に明確なパターンに分解するだけです。
彼らは、ページ上のコンテンツを見つける方法を再発明する代わりに、人々がすでに知っているもの、つまり CSS セレクターを活用しました。あとは、一般的な操作を集めて数十の機能に編成するだけです。 jQuery を使用して、前の例をもう一度試してみましょう:
リーリー
2006 年に、680 ページの Ajax の本を購入しました。 jQuery の優れた API により、これはほぼ次の API に取って代わられます:リーリー
WordPress APIwp_insert_post を使用します。
get_the_title を使用することもできますが、
get_the_permalink を使用するとエラーが生成されます。何千人ものコードと何百万人ものユーザーが関与する数十年にわたるオープンソース プロジェクトがある場合、いくつかの特殊な問題に遭遇することになります。
これらの癖をマスクし、あなたが書いているプログラマー (おそらくあなた自身) の習慣や行動に従って書くことで、時間を大幅に節約できます。ここでは、毎日使用するプラグインやテーマをプログラミングするための適切なインターフェイスを設計できます。
作業をスピードアップし、反復的なタスクを減らすために、常に必要なコマンドとカスタマイズを処理するライブラリを作成しました。
###1。一般的なタスクのショートカットID のみ)。
しかし、もっと良い方法があるはずです! リーリー 2: 予測不可能な入力、予測可能な出力
###ずっといい!実際、あなたはそれを常に使用し、社内の他の開発者と共有していることに気づきます。あなたの友人が困っているので、デバッグするようあなたに電話すると、次のことがわかります:
リーリー
彼は誤ってget_post
を使用したようです。あなたは彼に怒鳴りつけました。しかし、待ってください。なぜ受け入れられやすいものにしないのでしょうか?
WP_Post オブジェクトを受け取りながら、ユーザーが期待するものを提供できるように関数を調整できるかもしれません。関数に戻りましょう:
リーリー
したがって、ユーザーが
WP_Post オブジェクト または
get_thumbnail_src_by_post_id と
get_thumbnail_src_by_wp_post_object.
を作成できます。
実際には、より複雑な変換にはこの方が望ましいかもしれませんが、個々の関数を正しいサブルーチンにルーティングすることでインターフェイスを簡素化できます。ユーザーが何を送信しても、この関数は常に画像ソースの文字列を返します。
次に進みましょう: 何も送信しなかったらどうなりますか?
function get_thumbnail_src( $post = false ) { if ( false === $post ) { $post = get_the_ID(); } else if ( is_object( $post ) && isset( $post->ID ) ) { $post = $post->ID; } else if ( is_array( $post ) && isset( $post['ID'] ) ) { $post = $post['ID']; } $thumb_id = get_post_thumbnail_id( $post ); $src = wp_get_attachment_thumb_url( $thumb_id ); return $src; }
我们再次进行了简化,因此用户无需发送帖子,甚至无需发送帖子 ID。在循环中时,所需要做的就是:
echo '<img src="'.get_thumbnail_src().'" />';
我们的函数将默认为当前帖子的 ID。这正在变成一个非常有价值的功能。为了确保它能很好地发挥作用,让我们将它包装在一个类中,这样它就不会污染全局命名空间。
/* Plugin Name: JaredTools Description: My toolbox for WordPress themes. Author: Jared Novack Version: 0.1 Author URI: http://upstatement.com/ */ class JaredsTools { public static function get_thumbnail_src( $post = false ) { if (false === $post ) { $post = get_the_ID(); } else if ( is_object( $post ) && isset( $post->ID ) ) { $post = $post->ID; } else if ( is_array( $post ) && isset( $post['ID'] ) ) { $post = $post['ID']; } $thumb_id = get_post_thumbnail_id( $post ); $src = wp_get_attachment_thumb_url( $thumb_id ); return $src; } }
并且请不要在您的类前面添加 WP
。我将其设为公共静态函数,因为我希望它可以在任何地方访问,并且它不会改变:输入或执行不会更改函数或对象。
该函数的最终调用是:
echo '<img src="'.JaredsTools::get_thumbnail_src().'">';
让我们继续处理更复杂的需求。当我编写插件时,我发现我总是需要生成不同类型的错误和/或更新消息。
但是基于事件的语法一直困扰着我:
add_action( 'admin_notices', 'show_my_notice'); functon show_my_notice(){ echo '<div class="updated"><p>Your thing has been updated</p></div>'; }
WordPress 遵循这种基于事件的架构有很多充分的理由。但这并不直观,除非您想坐下来记住不同的过滤器和操作。
让我们将此匹配作为最简单的用例:我需要显示管理员通知。我喜欢首先设计这个 API:我找出在代码中引用该函数的最佳方式。我希望它读起来像这样:
function thing_that_happens_in_my_plugin($post_id, $value){ $updated = update_post_meta($post_id, $value); if ($updated){ JaredsTools::show_admin_notice("Your thing has been updated") } else { JaredsTools::show_admin_notice("Error updating your thing", "error"); } }
一旦我设计了端点,我就可以满足设计要求:
class JaredsTools { public static function show_admin_notice($message, $class = 'updated'){ add_action('admin_notices', function() use ($message, $class){ echo '<div class="'.$class.'"><p>'.$message.'</p></div>'; }); } }
好多了!现在我不需要创建所有这些额外的函数或记住疯狂的钩子名称。在这里,我使用 PHP 匿名函数(也称为“闭包”),它让我们可以将函数直接绑定到操作或过滤器。
这可以让您避免在文件中出现大量额外的函数。 use
命令让我们将参数从父函数传递到子闭包中。
现在另一位同事打电话给您。她不知道为什么她的管理通知没有变成红色:
JaredsTools::show_admin_notice("Error updating your thing", "red");
这是因为她正在发送“红色”(她希望将盒子变成红色),而实际上她应该发送触发红色的类名称。但为什么不让它变得更容易呢?
public static function show_notice( $message, $class = 'updated' ) { $class = trim( strtolower( $class ) ); if ( 'yellow' == $class ) { $class = 'updated'; } if ('red' == $class ) { $class = 'error'; } add_action( 'admin_notices', function() use ( $text, $class ) { echo '<div class="'.$class.'"><p>' . $text . '</p></div>'; }); }
我们现在已经接受了更多的用户容忍度,这将使我们在几个月后回来使用它时更容易分享。
在构建了其中一些之后,以下是我学到的一些原则,这些原则使这些原则对我和我的团队真正有用。
1.首先进行设计,让函数的构建符合人们想要使用它的方式。
2. 拯救你的键盘!为常见任务创建快捷方式。
3. 提供合理的默认值。
4. 保持最小化。让您的库来处理处理。
5. 对输入要宽容,对输出要精确。
6. 也就是说,使用尽可能少的函数参数,最多四个是一个很好的参数。之后,您应该将其设为选项数组。
7. 将您的库组织成单独的类,以涵盖不同的领域(管理、图像、自定义帖子等)。
8. 包含示例代码的文档。
在 Upstatement,我们的 Timber 库使构建主题变得更加容易,而 Jigsaw 提供了节省时间的快捷方式来自定义每个安装。
这些工具节省的时间让我们可以花更多时间构建每个网站或应用程序的新的和创新的部分。通过执行深奥的命令(例如向管理帖子表添加一列)并制作简单的界面:我们公司的任何设计师或开发人员都可以使用与专业 WordPress 开发人员相同的能力完全自定义每个网站。
以上がWordPress の強化: 改善された API とライブラリを構築するの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。