17713433920 info@mac163.com
使用PHP管理WordPress帖子–创建和更新
使用PHP管理WordPress帖子–创建和更新

如所承诺的,这是我第一篇文章的第二部分,“使用PHP创建WordPress帖子和页面-A 101教程”。在本文中,我们将研究如何扩展在第1部分中讨论的基本功能和理论,以创建健壮且最终可靠的PHP包装器类。

与往常一样,我对那些只想直接学习代码的人表示同情。您可以在我的Github仓库之一中找到它(将其直接粘贴到本文本身中太长了!)。

前叉MeHBT2
前叉MeHBT2

我们要实现的目标:

  • 一个功能齐全且可靠的PHP生产级框架。
  • 不仅可以管理帖子创建,还可以管理和更新现有帖子。
  • 能够搜索和操纵他们的帖子;ID; 头衔或子弹头。

本文将分为2节:使用说明分步指南。

事不宜迟,让我们开始吧!

用法

首先,请确保您已经包含了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 。这将是用于更新和创建帖子的数据(当我们进入时)。尽管您可能可以通过变量名称来猜测,但这是我们希望能够存储的数据列表。

  1. 标题
  2. 类型(页面/帖子等)
  3. 内容
  4. 类别/类别
  5. 页面模板
  6. ug
  7. 作者ID,以及
  8. 帖子的状态(例如发布/草稿)

第二个块将保存搜索查询将返回的实际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开源程序服务经验,我们一直在坚持客户体验,没有最好,只有更好!
回到顶部