当我们安装主题和插件时,都会向…
如所承诺的,这是我第一篇文章的第二部分,“使用PHP创建WordPress帖子和页面-A 101教程”。在本文中,我们将研究如何扩展在第1部分中讨论的基本功能和理论,以创建健壮且最终可靠的PHP包装器类。
与往常一样,我对那些只想直接学习代码的人表示同情。您可以在我的Github仓库之一中找到它(将其直接粘贴到本文本身中太长了!)。
我们要实现的目标:
- 一个功能齐全且可靠的PHP生产级框架。
- 不仅可以管理帖子创建,还可以管理和更新现有帖子。
- 能够搜索和操纵他们的帖子;ID; 头衔或子弹头。
事不宜迟,让我们开始吧!
用法
首先,请确保您已经包含了Github的class.postcontroller.php文件,或者已将该文件的内容粘贴到您的PHP文档中。没有它将无法工作!在本教程的后半部分,我们将看一下该文件中的代码。
实例化该类,如下所示;
$Poster = new PostController;
后控制器的工作原理是这样的;您可以使用相关功能设置帖子属性。然后,您可以创建或更新帖子。要更新帖子,您需要先搜索并找到要更新的帖子。听起来很简单?
设定属性
标题
设置帖子的标题。此处不允许HTML,并且已将其删除。
$Poster->set_title( 'The Title' );
类型
此方法设置页面的帖子类型。输入职位类型的子弹,例如 “帖子”和“页面”。支持自定义帖子类型。
$Poster->set_type( 'page' );
内容
此方法设置帖子的内容。允许使用HTML。
$Poster->set_content( '<h1>This is my awesome new post!</h1>' );
作者
设置帖子的作者。只需指定新作者的作者ID。必须是整数。
$Poster->set_author_id( 12 );
Slug /’Name’
这是帖子的自定义网址路径(如果启用)。请注意这一点,好像该子弹已在使用中一样,可能会导致一些错误。我已包括验证,以尽一切努力避免这种情况。不允许使用特殊字符或html。
$Poster->set_post_slug( "new_slug" );
模板(仅页面)
此方法允许您设置页面的模板(必须是页面)。如果应用于其他帖子类型,它将被忽略,并且错误将添加到errors数组。输入格式为“ php_template_name.php”,并且对于每个主题都是唯一的。
$Poster->set_page_template( 'fullwidth_page.php' );
状态
此方法设置帖子的状态。可用选项;
[“草稿” | ‘发布’| “待定” | ‘未来’| “私人” | 自定义注册状态
$Poster->set_post_state( "pending" );
创建
创建帖子的最低要求是设置标题。您可以使用以下代码来完成此操作;
$Poster->set_title( "New Post" );
设置完之后,只需运行create方法。
$Poster->create();
注意:该方法将检查是否存在其他具有相同名称的帖子(只是为了确保它没有重复)。因此,需要唯一的标题。
搜索
在更新现有帖子之前,我们首先必须使用搜索功能找到它。
为此,我们使用搜索方法。
$Poster->search( 'SEARCH_BY' , 'DATA' );
该方法接受2个参数,即要搜索的属性和要搜索的数据。
您可以按标题搜索;
$Poster->search( 'title' , 'DATA' );
您可以按ID搜索;
$Poster->search( 'id' , 'DATA' );
而且你可以弹搜索;
$Poster->search( 'slug' , 'DATA' );
data参数将接受字符串(如果按标题或子词搜索)或整数(如果按ID搜索)。如果找不到具有指定参数的帖子或页面,则会将错误添加到$ errors数组中。您可以使用以下代码调用并显示此代码。
$error = $Poster->get_var( 'errors' ); $Poster->PrettyPrint( $error );
更新
找到帖子后,您可以为其分配新属性。设置属性后,只需调用update方法。
$Poster->update();
例如,如果您想更改帖子1的标题(ID = 1),则可以使用以下代码。
$Poster->search( 'id', 1 ); $Poster->set_title( 'New Title' ); $Poster->update();
可以通过这种方式更新所有属性。
检索变量
要检索定义的变量,可以使用get_vars方法。
$Poster->get_var( 'title' ); // Returns the title (if you have set it) $Poster->get_var( 'type' ); // Returns the post type (if you have set it) $Poster->get_var( 'content' ); // Returns the content (if you have set it) $Poster->get_var( 'category' ); // Returns the category as an array (if set) $Poster->get_var( 'template' ); // Returns the template (if you have set it) $Poster->get_var( 'slug' ); // Returns the slug (if you have set it) $Poster->get_var( 'auth_id' ); // Returns the author id (if you have set it) $Poster->get_var( 'status' ); // Returns the post's status (if you have set it) $Poster->get_var( 'errors' ); // Returns the errors array /** AFTER YOU HAVE EITHER CREATED A POST OR SUCCESSFULLY SEARCHED FOR ONE YOU CAN USE THESE **/ // Returns the a PHP Object of the post. This can be used to check if the search method was successful $Poster->get_var( 'current_post' ); // Returns the selected post's ID (integer). $Poster->get_var( 'current_post_id' ); // Returns the URL permalink of the selected post $Poster->get_var( 'current_post_permalink' );
就这样!如果您对使用有任何疑问,可以在这里的评论中问我。如果您发现错误,请在Github上告诉我。
准备第二部分了吗?
建立课程:逐步指南
现在我们已经看到了如何使用该类,让我们回到开始。
我们的类将称为PostController ;
class PostController { . . . class functions go here . . . }
对于那些不熟悉PHP类的人,类被定义为一个对象,其中包含可一起使用的函数和变量的集合。请查看PHP.net简介,以获取有关将用于创建框架的语法和理论的更多详细信息。在我们的工作清单上,下一步是声明将要使用的所有变量。
// Variables for Post Data public $PC_title; public $PC_type; public $PC_content; public $PC_category; public $PC_template; public $PC_slug; public $PC_auth_id; public $PC_status = "publish"; // Variables for Post Updating public $PC_current_post; public $PC_current_post_id; public $PC_current_post_permalink; // Error Array public $PC_errors;
好的,所以我们将其分为三个区块。第一个区块将保存您指定的Post Data 。这将是用于更新和创建帖子的数据(当我们进入时)。尽管您可能可以通过变量名称来猜测,但这是我们希望能够存储的数据列表。
- 标题
- 类型(页面/帖子等)
- 内容
- 类别/类别
- 页面模板
- ug
- 作者ID,以及
- 帖子的状态(例如发布/草稿)
第二个块将保存搜索查询将返回的实际WordPress帖子数据(或创建后的有关已创建帖子的数据)。’$ PC_current_post’变量将保存整个帖子的对象。这将保存有关该帖子的所有数据,包括(重要地)上面列出的数据。同样,帖子ID和永久链接变量将保存有关现有帖子的那些数据。
第三块也是最后一块只有一个变量:errors数组。如果在已知的“捏”点遇到问题,则有关该问题的消息将添加到此数组中,以供您参考。请注意,我出于好习惯而包含了“ PC_”:变量名永远不应模棱两可。PC代表“ PostController”。如果更改此设置,请记住还要更改get_var()函数中的前缀。
正确,现在我们已经完成了所有设置,让我们开始研究我们的第一个功能。
// Creation functions
public function create() {
if ( isset( $this->PC_title ) ) {
if ( $this->PC_type == 'page' ) {
$post = get_page_by_title( $this->PC_title, 'OBJECT', $this->PC_type );
} else {
$post = get_page_by_title( $this->PC_title, 'OBJECT', $this->PC_type );
}
$post_data = array(
'post_title' => wp_strip_all_tags($this->PC_title),
'post_name' => $this->PC_slug,
'post_content' => $this->PC_content,
'post_status' => $this->PC_status,
'post_type' => $this->PC_type,
'post_author' => $this->PC_auth_id,
'post_category' => $this->PC_category,
'page_template' => $this->PC_template
);
if ( ! isset( $post ) ) {
$this->PC_current_post_id = wp_insert_post( $post_data, $error_obj );
$this->PC_current_post = get_post( ( integer ) $this->PC_current_post_id, 'OBJECT' );
$this->PC_current_post_permalink = get_permalink( ( integer ) $this->PC_current_post_id );
return $error_obj;
} else {
$this->update();
$this->errors[] = 'That page already exists. Try updating instead. Control passed to the update() function.';
return FALSE;
}
} else {
$this->errors[] = 'Title has not been set.';
return FALSE;
}
}
对于那些已经阅读本系列第1部分:使用PHP创建WordPress帖子和页面-A 101教程的人来说,此功能对您来说很熟悉。这只是适应该新设置后该教程中完成的功能。要阅读有关此特定功能的说明,我建议您阅读第1部分。该功能本身的唯一主要区别在于,它可以立即运行,而不是将功能添加到WordPress头中。
作为快速浏览,该函数检查是否已设置标题(这是创建帖子的最低要求)。然后,它会检查现有帖子(按标题)。如果找到了帖子,则会将一条消息添加到errors数组,并将控制权传递给update()函数。如果找不到带有该标题的帖子,则使用$ post_data创建一个新帖子。当前帖子变量(以及其他两个数据变量)将更新以保存此新帖子的数据。这对于检查您刚发布的帖子非常有用。如果存在问题,则会将一条消息添加到$ errors数组。
抱歉,这有点快:如果您有点困惑,我建议您阅读有关此问题的101条文章。
对于仍然与我在一起的所有人,让我们继续。
// SET POST'S TITLE public function set_title( $name ) { $this->PC_title = $name; return $this->PC_title; } // SET POST'S TYPE public function set_type( $type ) { $this->PC_type = $type; return $this->PC_type; } // SET POST'S CONTENT public function set_content( $content ) { $this->PC_content = $content; return $this->PC_content; } // SET POST'S AUTHOR ID public function set_author_id( $auth_id ) { $this->PC_auth_id = $auth_id; return $this->PC_auth_id; } // SET POST'S STATE public function set_post_state( $content ) { $this->PC_status = $content; return $this->PC_status; }
这一点很简单。在创建()和更新()函数都使用局部变量作为其数据的来源。因此,我们需要一种设置该数据的方法。如前所述,前5个变量已设置。“不过其他三个呢?”,我听到你问。不要担心,它们在这里,但是您会看到有一些验证可以验证其输入(以最大程度地提高可靠性)。
// SET POST SLUG public function set_post_slug( $slug ) { $args = array('name' => $slug); $posts_query = get_posts( $args ); if ( ! get_posts( $args ) && ! get_page_by_path( $this->PC_slug ) ) { $this->PC_slug = $slug; return $this->PC_slug; } else { $this->errors[] = 'Slug already in use.'; return FALSE; } } // SET PAGE TEMPLATE public function set_page_template( $content ) { if ( $this->PC_type == 'page' ) { $this->PC_template = $content; return $this->PC_template; } else { $this->errors[] = 'You can only use template for pages.'; return FALSE; } } // ADD CATEGORY IDs TO THE CATEGORIES ARRAY public function add_category( $IDs ){ if ( is_array( $IDs ) ) { foreach ( $IDs as $id ) { if ( is_int( $id ) ) { $this->PC_category[] = $id; } else { $this->errors[] = '<b>' .$id . '</b> is not a valid integer input.'; return FALSE; } } } else { $this->errors[] = 'Input specified in not a valid array.'; return FALSE; } }
最后三个比较复杂,但是对于避免可怕的错误非常重要。
set_post_slug()
该set_post_slug()函数是你需要的东西非常小心用。帖子标签实际上是添加到基本URL末尾以创建帖子的个人地址的字符串。WordPress还将其用作基本的帖子标识符。例如。这篇文章的子句是’manage-wordpress-posts-php-create-update’。它将添加到基本URL http://wpexplorer.com/的末尾,以创建本文的唯一URL:http : //www.wpexplorer.com/manage-wordpress-posts-php-create-update/。我敢肯定,如果有多个帖子具有相同的内容(以及URL),那么您会遇到的问题是可以想象的。如果可能的话,最好避免这种混乱。
子弹头一定是唯一的
这就是验证的原因。发生的情况是该函数搜索具有指定子词的帖子。如果没有找到与有与作为路径没有页面(基本上是在这种情况下一样的蛞蝓),那也不错!设置变量。如果不是,则将错误添加到$ errors数组,并且未设置变量(该函数返回布尔FALSE)。
set_page_template()和add_category()
set_page_template()将页面模板(形式为my_page_template.php)分配给Page,而只有页面。此处的验证仅检查帖子类型是否已设置为“页面”。如果为true,则存储数据。如果没有,请不要打扰。
add_category()允许您将整数数组添加到帖子的类别中(即使仅添加1个数字,也必须仍在数组中)。整数表示类别ID。验证仅遍历您指定的数组,检查每个单元格是否具有整数值。如果单元格具有整数值,则将其添加到主类别数组。如果不是,则将其忽略并将错误添加到错误数组。辉煌!现在,我们可以分配所需的所有变量。
正在搜寻
在本教程的开始,我们说过我们想做一个能够更新现有WordPress帖子的系统。为此,我们首先需要找到要编辑的帖子。为此,我们将使用search()函数。
// Search for Post function public function search( $by, $data ) { switch ( $by ) { // SEARCH FOR POST USING IT'S ID case 'id' : if ( is_integer( $data ) && get_post( ( integer ) $data ) !== NULL ) { $this->PC_current_post = get_post( ( integer ) $data, 'OBJECT' ); $this->PC_current_post_id = ( integer ) $data; $this->PC_current_post_permalink = get_permalink( (integer) $data ); return TRUE; } else { $this->errors[] = 'No post found with that ID.'; return FALSE; } break; case 'title' : $post = get_page_by_title( $data ); if ( ! $post ) { $post = get_page_by_title( $data, OBJECT, 'post' ); } $id = $post->ID; if ( is_integer($id) && get_post( (integer)$id) !== NULL ) { $this->PC_current_post = get_post( (integer)$id, 'OBJECT' ); $this->PC_current_post_id = (integer) $id; $this->PC_current_post_permalink = get_permalink( (integer) $id ); return TRUE; } else { $this->errors[] = 'No post found with that title.'; return FALSE; } break; // SEARCH FOR POST USING IT'S SLUG case 'slug' : $args = array( 'name' => $data, 'max_num_posts' => 1 ); $posts_query = get_posts( $args ); if ( $posts_query ) { $id = $posts_query[0]->ID; } else { $this->errors[] = 'No post found with that slug.'; } if ( is_integer($id) && get_post( (integer)$id) !== NULL ) { $this->PC_current_post = get_post( (integer)$id, 'OBJECT' ); $this->PC_current_post_id = (integer)$id; $this->PC_current_post_permalink = get_permalink((integer)$id); return TRUE; } else { $this->errors[] = 'No post found with that slug.'; return FALSE; } break; default: $this->errors[] = 'No post found.'; return FALSE; break; } }
这是search()函数。我使用的是PHP的switch语句(不同形式的IF语句,在这种情况下会比多层嵌套的Ifs的更高效更了解有关接通。PHP.net手册的搜索()函数接受2个参数;
1.“搜索
依据”值2.要搜索的数据
您可以从上面的代码中看到有3个“搜索依据”选项;’id’,’title’和’slug’。让我们更仔细地看看每个。
按ID搜索
这是最简单的搜索方法,仅要求您知道帖子的整数ID。如果指定的数据是整数,则该函数将向您的WordPress数据库发送查询(使用内置的get_post()函数)。如果存在具有该整数的帖子,则将返回该帖子对象,并将其存储在PC_current_post变量中(以及ID和永久链接也被存储)。简单!
按标题搜索
我认为这确实不需要太多解释:这与按ID搜索几乎相同,但可以按标题搜索帖子。如果您的帖子/页面具有相同的名称(我不建议这样做),则将选择ID最小的帖子。如果您知道确实有名称相同的帖子,请不要使用此方法来避免混淆。请注意:您将看到此代码;
$post = get_page_by_title( $data ); if ( ! $post ) { $post = get_page_by_title( $data, OBJECT, 'post' ); }
我们必须这样做的原因是,尽管get_page_by_title()可以返回帖子和页面的数据,但是除非第三个参数指定为“ post”,否则它仅返回页面。
我并不是要声明显而易见的内容,而是要意识到,如果您按标题搜索并同时更改标题,则该代码将只能运行一次(第一次)。之后,它将返回404 Not Found错误。
按弹头搜索
这是查找帖子的一种不错且可靠的方法。不应有歧义,因为正如我之前所说,,必须是唯一的。如果您不清楚“ 塞子”的含义,请查看SET_POST_SLUG()部分。为此,我们只需要运行WordPress帖子查询来查找具有特定子词的帖子。我们可以从此方法中检索ID并以与其他两种方法相同的方式设置当前的post变量。与按标题搜索相同,一起搜索和更改子弹将引起问题。谨防!
更新和管理
对!现在搜索已不复存在,我们可以继续进行实际的update()函数。
// Update Post public function update(){ if ( isset($this->PC_current_post_id ) ) { // Declare ID of Post to be updated $PC_post['ID'] = $this->PC_current_post_id; // Declare Content/Parameters of Post to be updated if ( isset($this->PC_title ) && $this->PC_title !== $this->PC_current_post->post_title ) { $PC_post['post_title'] = $this->PC_title; } if ( isset( $this->PC_type ) && $this->PC_type !== $this->PC_current_post->post_type ) { $PC_post['post_type'] = $this->PC_type; } if ( isset($this->PC_auth_id) && $this->PC_auth_id !== $this->PC_current_post->post_type ) { $PC_post['post_author'] = $this->PC_auth_id; } if ( isset($this->PC_status) && $this->PC_status !== $this->PC_current_post->post_status ) { $PC_post['post_status'] = $this->PC_status; } if ( isset($this->PC_category) && $this->PC_category !== $this->PC_current_post->post_category ) { $PC_post['post_category'] = $this->PC_category; } if ( isset($this->PC_template ) && $this->PC_template !== $this->PC_current_post->page_template && ( $PC_post['post_type'] == 'page' || $this->PC_current_post->post_type == 'page' ) ) { PC_post['page_template'] = $this->PC_template; } if ( isset( $this->PC_slug ) && $this->PC_slug !== $this->PC_current_post->post_name ) { $args = array('name' => $this->PC_slug); } if ( ! get_posts( $args ) && !get_page_by_path( $this->PC_slug ) ) { $PC_post['post_name'] = $this->PC_slug; } else { $errors[] = 'Slug Defined is Not Unique'; } if ( isset($this->PC_content) && $this->PC_content !== $this->PC_status->post_content ) { $PC_post['post_content'] = $this->PC_content; } wp_update_post( $PC_post ); } return( $errors ); }
我不会说谎,这一点真的很容易。本质上,更新功能检查是否已设置8个发布参数中的任何一个。如果这样,它将创建并填充一个与wp_update_post()兼容的数组。它运行wp_update_post(),嘿!做得好。为了提高效率,我们将在分配每个变量之前添加一个简单的检查。仅在更改后才更新。尽管我有点偏见,但我必须承认那是漂亮的代码!
将设置值与WordPress本身返回的值进行比较。然后只需要简单的比较。您会注意到,模板和sl IF语句比其他语句具有更多的验证性。尽管我们已经包括了验证功能,以过滤掉这些错误,但仔细检查并没有什么害处!页面模板检查(它检查是否将帖子类型设置为页面)仅仅是因为尝试为非帖子设置页面模板是我的错误。对不起,杀了!另一方面,弹头检查是重要的!您真的不希望有弹冲突。在这种情况下,不存在过度杀伤的情况。这几乎等于update()。最后,我们有一些有用的常规功能。
附加功能
既然已经编写了大部分的类,那么添加几个有用的/节省时间的函数始终是一个好主意。看一看;
// General functions
public function get_content() {
if ( isset( $this->PC_current_post->post_content ) ) {
return $this->PC_current_post->post_content;
}
}
public function get_var( $name ) {
$name = 'PC_'.$name;
if ( isset( $this->$name ) ) {
return $this->$name;
}
}
public function unset_all() {
foreach ( get_class_vars(get_class($this)) as $name => $default ) {
$this->$name = $default;
}
}
public function __toString() {
return 'Use the PrettyPrint function to return the contents of this Object. E.g;<pre>$my_post->PrettyPrintAll();</pre>';
}
public function PrettyPrint($data) {
echo "<pre>";
print_r( $data );
echo "</pre>";
}
public function PrettyPrintAll() {
echo "<pre>";
print_r( $this );
echo "</pre>";
}
快速说明;
- get_content():此函数返回您搜索的帖子的内容(这是WordPress提供的,而不是您设置的)。这不接受任何参数。
- get_var(’var_name’):有时在设置大量数据时可能会造成混乱。这接受一个参数:所需变量名称的字符串。这是可用的’var_name’的列表;
- ‘标题’ -您设置的帖子标题。
- ‘ type’-您设置的帖子类型。
- “内容” -您设置的内容。
- ‘category’–您设置的类别(返回数组)。
- ‘模板’ –您设置的页面模板。
- ‘ slug’-您设置的Slug。
- ‘auth_id’-您设置的作者ID。
- ‘状态’ -您设置的发布状态。
- ‘current_post’–搜索后返回的WP Post对象。
- ‘current_post_id’–搜索后返回的WP Post ID。
- ‘current_post_permalink’–搜索后返回的WP Post的永久链接。
- ‘错误’ –错误数组(非常有用)。
- unset_all():无参数。一份工作 删除存储在类实例中的所有数据。谨防。
- __toString():这是在打印类本身的实例时运行的。错误消息已打印。使用使用PrettyPrintAll()
// Start new class $Poster = new PostController(); // Echoes error message echo $Poster;
- PrettyPrint():这只是一个有用的函数,可以在“ pre”标签中很好地显示对象和数组。采用一个参数:数据为“ PrettyPrinted”。
- PrettyPrintAll():与“ PrettyPrint()”相同,除了“ PrettyPrints”类的整个实例(包括所有变量)。
这就是包装!
感谢您阅读我的文章:希望您发现它既有用又有启发性!
您可以在Github上找到PostController类的最新版本:PostController。如果您喜欢本教程,请分享!(无论提到什么,都不会:@ harribellthomas?)。如有任何疑问,请在下面的评论部分中保留。
微信扫描二维码联系我们!
我们在微信上24小时期待你的声音
提供外贸路由器设备产品,轻松翻墙,解答:WP主题推荐,WP网站建设,Google SEO,百度SEO,专业服务器环境搭建等!
需要提供WordPress主题/插件的汉化服务可以随时联系我们!另外成品WordPress网站以及半成品WordPress网站建设,海外Google SEO优化托管服务,百度SEO优化托管服务,Centos/Debian服务器WP专用环境搭建,WP缓存服务器搭建,我们都是你的首选,拥有多年WP开源程序服务经验,我们一直在坚持客户体验,没有最好,只有更好!