Rumah  >  Artikel  >  Tutorial CMS  >  Tingkatkan WordPress: Bina API dan perpustakaan yang dipertingkatkan

Tingkatkan WordPress: Bina API dan perpustakaan yang dipertingkatkan

WBOY
WBOYasal
2023-09-02 11:33:17957semak imbas

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

Rasanya semua yang kami temui direka bentuk dengan teliti: tapak web, telefon, peta kereta api bawah tanah, dsb. Malah perkara yang pernah kami ambil mudah: termostat, pengesan asap dan papan pemuka kereta kini mendapat rawatan pengalaman pengguna yang teliti.

Reka bentuk bukan sekadar rupa dan rasa: ia juga perlu mempertimbangkan pelbagai cara pengguna perlu berinteraksi dengan peranti/alat/skrin/objek kami.

Ini juga terpakai untuk pengaturcaraan.

Pengaturcaraan oleh (un)reka bentuk

Bahasa pengaturcaraan adalah dunia yang besar dan kompleks. Malah PHP, yang dianggap oleh ramai pengaturcaraan terlalu "mudah", sebenarnya adalah gabungan fungsi dan kelas yang agak kompleks yang berkelakuan dengan cara yang sangat tidak konsisten.

Sintaks, kaedah dan tatanama telah berkembang selama bertahun-tahun merentas berjuta-juta pengguna dan aplikasi yang berbeza. Kebanyakannya cenderung untuk mencerminkan pembinaan asas di dalam - tidak semestinya cara anda ingin menggunakannya.

Momen hebat dalam reka bentuk API: jQuery

​​>

Apabila saya mula menulis JavaScript sekitar tahun 2006, keadaan menjadi kucar-kacir. Begini cara saya mencari teg dengan kelas tertentu dan mengalihkannya di sekitar 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;

Selesai!

jQuery menjadikan JavaScript menyeronokkan semula. Pada penghujung 2000-an, impaknya sangat besar sehingga saya ingat ayah saya bertanya kepada saya tentang "sesuatu yang pelik" yang dia baca dalam Wall Street Journal. Tetapi walaupun kesannya yang besar, jQuery tidak menambah sebarang "fungsi baharu" pada JavaScript. Ia hanya memecahkan perkara yang perlu dilakukan oleh pembangun kepada corak yang sangat jelas.

Daripada mencipta semula cara mencari kandungan pada halaman, mereka memanfaatkan sesuatu yang orang sudah tahu: pemilih CSS. Kemudian ia hanya perlu mengumpulkan sekumpulan operasi biasa dan menyusunnya ke dalam berpuluh-puluh fungsi. Mari cuba contoh sebelumnya sekali lagi, kini menggunakan jQuery:

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

Pada tahun 2006, saya membeli buku Ajax setebal 680 halaman. Dengan API hebat jQuery, ia hampir digantikan dengan ini:

$.post();

WordPress API

Walaupun API telah menjadi singkatan untuk "Perkhidmatan Pihak Ketiga", ia hanya bermaksud antara muka pengaturcaraan yang bercakap dengan sistem. Sama seperti API Twitter atau API Facebook, API WordPress juga wujud. Anda tidak akan melakukan pertanyaan pangkalan data mentah untuk membuat siaran, bukan? Anda menggunakan wp_insert_post. wp_insert_post

但是许多设计漏洞困扰着 WordPress API。您可能使用 get_the_titleget_the_permalink 会生成错误,您使用 get_permalink 。嘿,当您有一个长达数十年的开源项目,涉及数千人的代码和数百万用户时:您会遇到一些怪癖。

通过掩盖这些怪癖并根据您正在编写的程序员(可能是您)的习惯和行为进行编写,您可以节省大量时间。您可以在这里设计正确的界面来对您日常使用的插件和主题进行编程。


解决方案

为了加快工作速度并减少重复性任务,我创建了库来处理我一直需要的命令和自定义设置。

1。常见任务的快捷方式

以获取帖子缩略图的来源为例。事实证明,WordPress 没有内置功能来根据帖子 ID(仅附件 ID)获取缩略图。

这意味着我经常发现自己这样做:

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

但是一定有更好的方法!

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() ) . '" />';

2:不可预测的输入,可预测的输出

好多了!事实上,您发现自己一直在使用它,然后与公司的其他开发人员共享。

你的朋友遇到了麻烦,所以他打电话给你来调试,你看到:

echo '<img src="' . get_thumbnail_src( get_post() ) . '">';

看来他不小心使用了 get_post 而不是 get_the_ID。你对他大喊大叫。但是等一下,为什么不让它更容易被接受呢?

也许我们可以调整我们的函数,以便它可以采用 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;
    
}

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

Tetapi banyak lubang reka bentuk mengganggu API WordPress. Anda mungkin menggunakan get_the_title tetapi get_the_permalink akan menjana ralat jika anda menggunakan get_permalink . Hei, apabila anda mempunyai projek sumber terbuka selama beberapa dekad yang melibatkan beribu-ribu kod orang dan berjuta-juta pengguna: anda akan menghadapi beberapa keanehan.

Anda boleh menjimatkan banyak masa dengan menutup ciri-ciri ini dan menulis mengikut tabiat dan tingkah laku pengaturcara yang anda tulis untuk (iaitu anda mungkin). Di sinilah anda boleh mereka bentuk antara muka yang betul untuk memprogramkan pemalam dan tema yang anda gunakan setiap hari.


Penyelesaian🎜 🎜Untuk mempercepatkan kerja saya dan mengurangkan tugasan yang berulang, saya mencipta perpustakaan untuk mengendalikan arahan dan penyesuaian yang sentiasa saya perlukan. 🎜

1. Pintasan kepada tugas biasa

🎜Ambil mendapatkan sumber imej kecil siaran sebagai contoh. Ternyata WordPress tidak mempunyai fungsi terbina dalam untuk mendapatkan lakaran kecil berdasarkan ID siaran (hanya ID lampiran). 🎜 🎜Ini bermakna saya sering mendapati diri saya melakukan ini: 🎜
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;
    
}
🎜Tetapi mesti ada cara yang lebih baik! 🎜
echo '<img src="'.get_thumbnail_src().'" />';

2: Input yang tidak dapat diramal, output yang boleh diramal

🎜Lebih baik! Malah, anda mendapati diri anda menggunakannya sepanjang masa dan kemudian berkongsinya dengan pembangun lain dalam syarikat. 🎜 🎜Rakan anda menghadapi masalah, jadi dia memanggil anda untuk nyahpepijat, dan anda melihat: 🎜
/*
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;
        
    }
    
}
🎜Nampaknya dia secara tidak sengaja menggunakan get_post dan bukannya get_the_ID. Anda menjerit kepadanya. Tetapi tunggu, kenapa tidak menjadikannya lebih boleh diterima? 🎜 🎜Mungkin kita boleh melaraskan fungsi kita supaya ia boleh mengambil objek WP_Post dan masih memberikan pengguna apa yang mereka harapkan. Mari kita kembali kepada fungsi: 🎜
echo '<img src="'.JaredsTools::get_thumbnail_src().'">';
🎜Jadi, jika mereka menghantar objek WP_Postatautatasusunan, fungsi anda masih boleh membantu mereka mendapatkan perkara yang mereka perlukan. Ini adalah bahagian penting API yang berjaya: menyembunyikan dalaman yang tidak kemas. Anda boleh membuat fungsi berasingan untuk get_thumbnail_src_by_post_id dan get_thumbnail_src_by_wp_post_object. 🎜 🎜Malah, ia mungkin lebih baik untuk transformasi yang lebih kompleks, tetapi anda boleh memudahkan antara muka dengan menghalakan fungsi individu ke subrutin yang betul. Tidak kira apa yang dihantar pengguna, fungsi ini akan sentiasa mengembalikan rentetan sumber imej. 🎜 🎜Mari teruskan: Bagaimana jika mereka tidak menghantar apa-apa? 🎜

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;
    
}

我们再次进行了简化,因此用户无需发送帖子,甚至无需发送帖子 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 开发人员相同的能力完全自定义每个网站。

Atas ialah kandungan terperinci Tingkatkan WordPress: Bina API dan perpustakaan yang dipertingkatkan. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn