WordPress如何复制指定页面或文章
  • 3年前
  • WordPress如何复制指定页面或文章1561
  • 使用WordPress建站的朋友很多,需求也是各不相同,有些人每天发布的内容不一样,这比较正常,但是有些人每天可能发布的内容基本一致,修改的地方不会很多,那么就会存在每天重复做一件事情的麻烦情况,虽然我们可以通过复制黏贴内容来解决这种需求,但是更加效率的方法才是真的解决方式。

    那么如何直接一键复制文章内容,包括标签分类这些呢?下面推荐两种,一种是通过插件解决,另外一种则是通过代码。

    Yoast Duplicate Post插件实现

    简单的搜索了一下,相关插件还是挺多的,但是比较有名的就是一款名为:Yoast Duplicate Post的插件,插件方面支持中文,设定方面也是非常丰富,下面是几张相关截图:

    使用起来也是非常方便的,直接点击按钮即可跳转到相对应的页面了。

    自定义代码实现

    /*
     * Function for post duplication. Dups appear as drafts. User is redirected to the edit screen
     */
    function rd_duplicate_post_as_draft() {
    	global $wpdb;
    	if ( ! ( isset( $_GET['post'] ) || isset( $_POST['post'] ) || ( isset( $_REQUEST['action'] ) && 'rd_duplicate_post_as_draft' == $_REQUEST['action'] ) ) ) {
    		wp_die( 'No post to duplicate has been supplied!' );
    	}
    
    	/*
    	 * Nonce verification
    	 */
    	if ( ! isset( $_GET['duplicate_nonce'] ) || ! wp_verify_nonce( $_GET['duplicate_nonce'], basename( __FILE__ ) ) ) {
    		return;
    	}
    
    
    	//获取文章ID
    	$post_id = ( isset( $_GET['post'] ) ? absint( $_GET['post'] ) : absint( $_POST['post'] ) );
    	$post    = get_post( $post_id );
    
    	//修改文章作者为当前用户
    	//如果你希望复制之后的文章作者依然为原始文章的作者
    	//请将$new_post_author = $current_user->ID;修改为$new_post_author = $post->post_author;即可
    	$current_user    = wp_get_current_user();
    	$new_post_author = $current_user->ID;
    
    
    	//判断文章需要复制的文章是否存在
    	if ( isset( $post ) && $post != null ) {
    
            //文章数据
    		$args = array(
    			'comment_status' => $post->comment_status,
    			'ping_status'    => $post->ping_status,
    			'post_author'    => $new_post_author,
    			'post_content'   => $post->post_content,
    			'post_excerpt'   => $post->post_excerpt,
    			'post_name'      => $post->post_name,
    			'post_parent'    => $post->post_parent,
    			'post_password'  => $post->post_password,
    			'post_status'    => 'draft',
    			'post_title'     => $post->post_title,
    			'post_type'      => $post->post_type,
    			'to_ping'        => $post->to_ping,
    			'menu_order'     => $post->menu_order,
    		);
            
            //插入文章
            $new_post_id = wp_insert_post( $args );
            
            //获取原始文章关联信息并且插入新的文章内
    		$taxonomies = get_object_taxonomies( $post->post_type ); // returns array of taxonomy names for post type, ex array("category", "post_tag");
    		foreach ( $taxonomies as $taxonomy ) {
    			$post_terms = wp_get_object_terms( $post_id, $taxonomy, array( 'fields' => 'slugs' ) );
    			wp_set_object_terms( $new_post_id, $post_terms, $taxonomy, false );
    		}
            
            //通过两条SQL语句来更新新文章的postmeta
    		$post_meta_infos = $wpdb->get_results( "SELECT meta_key, meta_value FROM $wpdb->postmeta WHERE post_id=$post_id" );
    		if ( count( $post_meta_infos ) !== 0 ) {
    			$sql_query = "INSERT INTO $wpdb->postmeta (post_id, meta_key, meta_value) ";
    			foreach ( $post_meta_infos as $meta_info ) {
    				$meta_key = $meta_info->meta_key;
    				if ( $meta_key === '_wp_old_slug' ) {
    					continue;
    				}
    				$meta_value      = addslashes( $meta_info->meta_value );
    				$sql_query_sel[] = "SELECT $new_post_id, '$meta_key', '$meta_value'";
    			}
    			$sql_query .= implode( " UNION ALL ", $sql_query_sel );
    			$wpdb->query( $sql_query );
    		}
    
            //跳转到新文章页面
    		wp_redirect( admin_url( 'post.php?action=edit&post=' . $new_post_id ) );
    		exit;
    	} else {
            //文章创建失败并给出相关提示内容
    		wp_die( 'Post creation failed, could not find original post: ' . $post_id );
    	}
    }
    
    add_action( 'admin_action_rd_duplicate_post_as_draft', 'rd_duplicate_post_as_draft' );
    
    //后台文章列表页面文章栏目添加对应的按钮
    function rd_duplicate_post_link( $actions, $post ) {
    	if ( current_user_can( 'edit_posts' ) ) {
    		$actions['duplicate'] = 'Duplicate';
    	}
    
    	return $actions;
    }
    
    add_filter( 'post_row_actions', 'rd_duplicate_post_link', 10, 2 );
    

    上面的代码来源: https://www.hostinger.com/tutorials/how-to-duplicate-wordpress-page-or-post

    整体代码看似比较复杂,但是好在逻辑还是比较清晰的,相关的说明我已经在代码中进行了标注,帮助大家简单的理解每个部分的内容是用来做什么的。

    总结

    整体来说,插件的功能更加丰富,可能代码方面更加全面,使用或者后期维护成本比较低;代码方式则是满足那些不喜欢装插件的朋友后。不过如果你能理解代码版本的含义,那么基于这个版本进行扩展,可能就是多了几个判断,额外增加一些内容的检测而已,有动手能力的朋友推荐代码方式,提高自己的技术。如果懒得折腾,插件则会更加高效、方便、省事。

  • 联系我们
  • 有任何疑问欢迎联系我们
  • WP新手学园
  • WordPress如何复制指定页面或文章
  • 邮箱:2830776172#qq.com(#换成@)
  • 回复时间:9:00-19:00
  • 如果提问.请图文并茂,详细描述问题
  • WordPress如何复制指定页面或文章
  • 微信号:wpxsxy_official
  • 仅支持付费解决问题
  • *并非所有问题都会被回复
  • WordPress如何复制指定页面或文章
  • QQ:2830776172
  • 回复时间:9:00-19:00
  • QQ仅支持付费提问,时间有限,尽情谅解
  • WordPress如何复制指定页面或文章
  • QQ群:198768181
  • 有问题可以进去提问,寻求群友帮助
  • *并非所有问题都会被回复
  • WordPress如何复制指定页面或文章
  • 咸鱼:WP新手学园
  • 如果对于直接交易不放心,可以走闲鱼
  • *咸鱼价格不作为最终交易价格
  • 备案号:鄂ICP备2021011647号-1