Verbessern Sie WordPress: Erstellen Sie verbesserte APIs und Bibliotheken

WBOY
Freigeben: 2023-09-02 11:33:17
Original
937 Leute haben es durchsucht

增强 WordPress:打造改进的 API 和库

Es fühlt sich an, als wäre alles, mit dem wir in Kontakt kommen, sorgfältig gestaltet: Website, Telefon, U-Bahn-Plan usw. Sogar Dinge, die wir früher für selbstverständlich hielten: Thermostate, Rauchmelder und Armaturenbretter in Autos werden jetzt sorgfältig in Bezug auf das Benutzererlebnis behandelt.

Design ist mehr als nur Aussehen und Haptik: Es muss auch die verschiedenen Arten berücksichtigen, wie Benutzer mit unseren Geräten/Tools/Bildschirmen/Objekten interagieren müssen.

Das gilt auch für die Programmierung.

Programmierung durch (Un)Design

Programmiersprachen sind eine große und komplexe Welt. Sogar PHP, das viele Programmier-Snobs für zu „einfach“ halten, ist eigentlich eine ziemlich komplexe Kombination aus Funktionen und Klassen, die sich auf sehr inkonsistente Weise verhalten.

Die Syntax, Methoden und Nomenklatur haben sich im Laufe der Jahre für Millionen verschiedener Benutzer und Anwendungen weiterentwickelt. Die meisten neigen dazu, die zugrunde liegende Konstruktion im Inneren widerzuspiegeln – nicht unbedingt die Art und Weise, wie Sie sie verwenden möchten.

Großartige Momente im API-Design: jQuery

​​>

Als ich etwa 2006 anfing, JavaScript zu schreiben, herrschte Chaos. So finde ich ein Tag mit einer bestimmten Klasse und verschiebe es im DOM:

var uls = getElementsByTagName("ul");
var classToSearch = "foods";
for (var i = 0; i < uls.length; i++) {
    var classes = uls[i].getClasses();
    for (var j = 0; j < classes.length; j++){
        if (classes[j] == classToSearch){
            myUL = uls[i];
        }
    }
}

var $li = document.createElement('li');
$li.innerHTML = 'Steak';
myUL.innerHTML += $li;
Nach dem Login kopieren

Fertig!

jQuery macht JavaScript wieder Spaß. In den späten 2000er Jahren war die Wirkung so groß, dass ich mich daran erinnere, dass mein Vater mich nach „etwas Seltsamem“ fragte, worüber er im Wall Street Journal gelesen hatte. Trotz seiner enormen Wirkung fügt jQuery JavaScript jedoch keine „neuen Funktionen“ hinzu. Es unterteilt lediglich die Aufgaben der Entwickler in sehr klare Muster.

Anstatt die Suche nach Inhalten auf einer Seite neu zu erfinden, nutzten sie etwas, das die Leute bereits wussten: CSS-Selektoren. Dann geht es nur noch darum, eine Reihe allgemeiner Vorgänge zu sammeln und sie in Dutzende von Funktionen zu organisieren. Versuchen wir es noch einmal mit dem vorherigen Beispiel, jetzt mit jQuery:

var $li = $('<li>Steak</li>');
$("ul.foods").append($li);
Nach dem Login kopieren

2006 kaufte ich ein 680-seitiges Ajax-Buch. Mit der großartigen API von jQuery wird es fast durch Folgendes ersetzt:

$.post();
Nach dem Login kopieren

WordPress-API

Während API mittlerweile für „Third Party Service“ steht, bedeutet es einfach eine Programmierschnittstelle, die mit einem System kommuniziert. Genau wie die Twitter-API oder die Facebook-API existiert auch die WordPress-API. Sie würden doch keine reine Datenbankabfrage durchführen, um einen Beitrag zu erstellen, oder? Du verwendest wp_insert_post.

Aber viele Designlücken plagen die WordPress-API. Sie könnten get_the_titleget_the_permalink 会生成错误,您使用 get_permalink verwenden. Hey, wenn Sie ein jahrzehntelanges Open-Source-Projekt haben, an dem der Code von Tausenden von Menschen und Millionen von Benutzern beteiligt sind, werden Sie auf einige Macken stoßen.

Sie können viel Zeit sparen, indem Sie diese Macken maskieren und entsprechend den Gewohnheiten und Verhaltensweisen des Programmierers schreiben, für den Sie schreiben (was wahrscheinlich Sie sind). Hier können Sie die richtige Schnittstelle für die Programmierung der Plugins und Themes entwerfen, die Sie täglich verwenden.


Lösung

Um meine Arbeit zu beschleunigen und sich wiederholende Aufgaben zu reduzieren, habe ich Bibliotheken erstellt, um die Befehle und Anpassungen zu verwalten, die ich immer brauchte.

1. Verknüpfungen zu häufigen Aufgaben

Nehmen Sie als Beispiel die Quelle der Post-Thumbnails. Es stellt sich heraus, dass WordPress keine integrierte Funktion zum Abrufen von Miniaturansichten basierend auf Beitrags-IDs (nur Anhangs-IDs) hat.

Das bedeutet, dass ich oft Folgendes tue:

$thumb_id = get_post_thumbnail_id( get_the_ID() );
$src = wp_get_attachment_thumb_url( $thumb_id );
echo '<img alt="" src="' . $src . '" />';
Nach dem Login kopieren

Aber es muss einen besseren Weg geben!

function get_thumbnail_src( $post ){

    $thumb_id = get_post_thumbnail_id( $post );
    $src = wp_get_attachment_thumb_url( $thumb_id );
    
    return $src;
}

echo '<img alt="" src="' . get_thumbnail_src( get_the_ID() ) . '" />';
Nach dem Login kopieren

2: Unvorhersehbarer Input, vorhersehbarer Output

Viel besser! Tatsächlich verwenden Sie es ständig und teilen es dann mit anderen Entwicklern im Unternehmen.

Dein Freund ist in Schwierigkeiten, also ruft er dich zum Debuggen an und du siehst:

echo '<img src="' . get_thumbnail_src( get_post() ) . '">';
Nach dem Login kopieren

Sieht so aus, als hätte er versehentlich

benutzt. Du hast ihn angeschrien. Aber warten Sie, get_post 而不是 get_the_IDwarum es nicht akzeptabler machen?

Vielleicht können wir unsere Funktion so anpassen, dass sie ein

Objekt aufnehmen kann und dem Benutzer trotzdem das gibt, was er erwartet. Kommen wir zurück zur Funktion: WP_Post

function get_thumbnail_src( $post ){

    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;
    
}
Nach dem Login kopieren

Wenn sie also

ein Objekt WP_Post 对象一个数组,您的函数仍然可以帮助他们获得所需的内容。这是成功 API 的重要组成部分:隐藏混乱的内部结构。您可以为 get_thumbnail_src_by_post_idget_thumbnail_src_by_wp_post_object. oder

ein Array senden, kann Ihre Funktion ihnen trotzdem dabei helfen, das zu bekommen, was sie brauchen. Dies ist ein wichtiger Teil einer erfolgreichen API: das Verstecken unordentlicher Interna. Sie können separate Funktionen für get_thumbnail_src_by_post_id und get_thumbnail_src_by_wp_post_object. erstellen

Tatsächlich könnte es für komplexere Konvertierungen vorzuziehen sein, aber Sie können die Schnittstelle vereinfachen, indem Sie einzelne Funktionen an die richtigen Unterprogramme weiterleiten. Unabhängig davon, was der Benutzer sendet, gibt diese Funktion immer die Zeichenfolge der Bildquelle zurück.

Lass uns weitermachen: Was ist, wenn sie nichts senden? 🎜

3。合理的默认值

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;
    
}
Nach dem Login kopieren

我们再次进行了简化,因此用户无需发送帖子,甚至无需发送帖子 ID。在循环中时,所需要做的就是:

echo '<img src="'.get_thumbnail_src().'" />';
Nach dem Login kopieren

我们的函数将默认为当前帖子的 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;
        
    }
    
}
Nach dem Login kopieren

并且不要在您的类前面添加 WP。我将其设为公共静态函数,因为我希望它可以在任何地方访问,并且它不会改变:输入或执行不会更改函数或对象。

该函数的最终调用是:

echo '<img src="'.JaredsTools::get_thumbnail_src().'">';
Nach dem Login kopieren

先设计,后构建

让我们继续处理更复杂的需求。当我编写插件时,我发现我总是需要生成不同类型的错误和/或更新消息。

但是基于事件的语法一直困扰着我:

add_action( 'admin_notices', 'show_my_notice');
functon show_my_notice(){
    echo '<div class="updated"><p>Your thing has been updated</p></div>';
}
Nach dem Login kopieren

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");
    }
}
Nach dem Login kopieren

一旦我设计了端点,我就可以满足设计要求:

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>';
        });
    }
}
Nach dem Login kopieren

好多了!现在我不需要创建所有这些额外的函数或记住疯狂的钩子名称。在这里,我使用 PHP 匿名函数(也称为“闭包”),它让我们可以将函数直接绑定到操作或过滤器。

这可以让您避免在文件中出现大量额外的函数。 use 命令让我们将参数从父函数传递到子闭包中。

保持直觉

现在另一位同事打电话给您。她不知道为什么她的管理通知没有变成红色:

JaredsTools::show_admin_notice("Error updating your thing", "red");
Nach dem Login kopieren

这是因为她正在发送“红色”(她希望将盒子变成红色),而实际上她应该发送触发红色的名称。但为什么不让它变得更容易呢?

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>';
    });
}
Nach dem Login kopieren

我们现在已经接受了更多的用户容忍度,这将使我们在几个月后回来使用它时更容易分享。


结论

在构建了其中一些之后,以下是我学到的一些原则,这些原则使这些原则对我和我的团队真正有用。

1.首先进行设计,让函数的构建符合人们想要使用它的方式。

2. 拯救你的键盘!为常见任务创建快捷方式。

3. 提供合理的默认值。

4. 保持最小化。让您的库来处理处理。

5. 对输入要宽容,对输出要精确。

6. 也就是说,使用尽可能少的函数参数,最多四个是一个很好的参数。之后,您应该将其设为选项数组。

7. 将您的库组织成单独的类,以涵盖不同的领域(管理、图像、自定义帖子等)。

8. 包含示例代码的文档。

在 Upstatement,我们的 Timber 库使构建主题变得更加容易,而 Jigsaw 提供了节省时间的快捷方式来自定义每个安装。

这些工具节省的时间让我们可以花更多时间构建每个网站或应用程序的新的和创新的部分。通过执行深奥的命令(例如向管理帖子表添加一列)并制作简单的界面:我们公司的任何设计师或开发人员都可以使用与专业 WordPress 开发人员相同的能力完全自定义每个网站。

Das obige ist der detaillierte Inhalt vonVerbessern Sie WordPress: Erstellen Sie verbesserte APIs und Bibliotheken. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage
Über uns Haftungsausschluss Sitemap
Chinesische PHP-Website:Online-PHP-Schulung für das Gemeinwohl,Helfen Sie PHP-Lernenden, sich schnell weiterzuentwickeln!