Tạo trang đăng bài cho thành viên wordpress không cần plugin

Bắt đầu nào :

Đầu tiên Bạn cần tạo 1 file đăng bài: dang-bai.php
Mình sẽ viết và giải thích từng phần. Sau đó sẽ có 1 file hoàn tất.

 

– kiểm tra xem thành viên đã đăng ký hay chưa, nếu đã đăng ký thì lấy thông tin thành viên, ngược lại nếu chưa đăng ký thì hiện khung đăng nhập:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<?php
/*
 Template Name: Đăng bài
 */
 ?>
<?php if(is_user_logged_in()) {
$user_id = get_current_user_id();
$current_user = wp_get_current_user();
$vnkings $current_user->user_level;
if($vnkings <= 2) { $vnstatus = "pending"; } else { $vnstatus = "publish"; }
?>
// form đăng bài
<?php } else { ?>
<div class="formdangnhap">
    <?php wp_login_form(); ?>           
</div>
<?php } ?>

Giải thích đoạn code :

  • Template Name: Đăng bài : Tạo template Đăng bài.
  • if(is_user_logged_in()) { : Nếu là thành viên đăng nhập.
  • $user_id = get_current_user_id(); : Lấy id của thành viên.
  • $current_user = wp_get_current_user(); : Lấy tất cả thông tin thành viên.
  • $vnkings = $current_user->user_level; : Lấy User level.
  • if($vnkings <= 2) { $vnstatus = “pending”; } else { $vnstatus = “publish”; } : Kiểm tra user đang là quyền gì, nếu là Thành viên đăng ký thì bài viết sẽ được cho vào dạng chờ xét duyệt, nếu là Tác giả trở lên thì cho phép Public bài viết luôn.
  • wp_login_form(); : form đăng nhập mặc định của wordpress

 

-Thêm form đăng bài : trong form này mình đã tạo theo cấu trúc của Bootstrap cho các bạn dễ tùy biến.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
<div id="vnkings_postBox">
    <form id="new_post" class="form-horizontal" method="post" action="" enctype="multipart/form-data">
        <div class="form-group vnking_pd col-sm-12 col-md-6">
            <label for="post_title">Tiêu đề</label>
            <input type="text" name="post_title" class="form-control" placeholder="Tiêu đề">
        </div>
        <div class="form-group vnking_pd pd_0">
          <label for="post_content">Nội Dung</label>
          <?php $post_obj = $wp_query->get_queried_object(); wp_editor( $post_obj->post_content, 'userpostcontent', array( 'textarea_name' => 'post_content' ));?>
        </div>
        <div class="form-group vnking_pd col-md-6">
          <label for="post_content">Danh mục</label>
            <?php $categories = wp_dropdown_categories("echo=0&hide_empty=0&selected=0");
                preg_match_all('/s*<option class="(S*)" value="(S*)">(.*)</option>s*/', $categories, $matches, PREG_SET_ORDER);
                echo "<select id='post_category' class='form-control' name='post_category'>";
                foreach ($matches as $match){
                echo "<option value='{$match[2]}'>{$match[3]}</option>";
                }
                echo "</select><br />n";
            ?>
        </div>
        <div class="form-group vnking_pd col-md-6">
          <label for="post_tags">Từ khóa</label>
          <input type="text" name="post_tags" class="form-control" placeholder="Từ khóa">
        </div>
        <div class="form-group">
            <p><img id="output_avatar"/></p>
            <script>
              var loadFile = function(event) {
                var output = document.getElementById('output_avatar');
                output.src = URL.createObjectURL(event.target.files[0]);
                 $('#output_avatar').addClass('active-avatar');
              };
            </script>
            <span class="btn btn-default btn-file">Hình ảnh bài viết <input class="input-file" accept="image/*" name="file" type="file" class="file" onchange="loadFile(event)">
            </span>
        </div>
        <input type="hidden" name="add_new_post" value="post" />
        <?php wp_nonce_field( 'post_nonce', 'post_nonce_field' ); ?>
        <div class="form-group">
            <div class="col-sm-12" style="padding-left:0;">
              <button type="submit" class="btn btn-primary">Đăng Bài</button>
            </div>
        </div>
    </form>
</div>

Giải thích đoạn code :

Trong form này các bạn cần tạo các trường cơ bản như :

  • input name=”post_title” :Nhập Tiêu đề
  • wp_editor() :Tạo Form nội dung mặc định của WordPress
  • wp_dropdown_categories() : Chọn danh mục cho bài viết của bạn
  • input name=”post_tags” : Nhập tags bài viết
  • input name=”file” : Tạo ảnh đại diện bài viết
  • wp_nonce_field() : Bảo mật cho form bài viết, giúp chứng thực sự hoạt động của người dùng nếu form đăng bài gửi đi

– Kiểm tra dữ liệu và đăng bài viết

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
<?php if( $_SERVER['REQUEST_METHOD'] == 'POST' && !empty( $_POST['add_new_post'] ) && current_user_can('level_0') && isset( $_POST['post_nonce_field'] ) && wp_verify_nonce( $_POST['post_nonce_field'], 'post_nonce' )) {
if (isset($_POST['post_title'])) {
    $post_title = $_POST['post_title'];
}
if (isset($_POST['post_content'])) {
    $post_content = $_POST['post_content'];
}
else {
    echo 'Please enter the content';
}
if (isset ($_POST['post_category'])) {
    $post_category = $_POST['post_category'];
}
if (isset($_POST['post_tags'])) {
    $post_tags = $_POST['post_tags'];
}
$post = array(
    'post_title'    => wp_strip_all_tags($post_title),
    'post_content'  => $post_content,
    'post_category' => array($post_category),
    'tags_input'    => $post_tags,
    'post_status'   => $vnstatus,
    'post_type' => 'post',
);
$vnkings_post_id = wp_insert_post($post);
if ($_FILES) {
    foreach ($_FILES as $file => $array) {
    $newupload = insert_attachment($file,$vnkings_post_id);
    }
}
echo '<div class="alert alert-success"><strong>Bạn đã đăng bài thành công!</strong></div>';
}?>

Giải thích đoạn code : :

  • if( $_SERVER[‘REQUEST_METHOD’] == ‘POST’ && !empty( $_POST[‘add_new_post’] ) : Khi có hành động gửi bài viết có yêu cầu là POST
  • current_user_can(‘level_0’) : thành viên cần là thành viên đăng ký
  • isset( $_POST[‘post_nonce_field’] ) && wp_verify_nonce( $_POST[‘post_nonce_field’], ‘post_nonce’ ): Tồn tại và xác nhận trường post_nonce_field (Bảo mật)
  • if (isset($_POST[‘tên trường’])) : Kiểm tra đã nhập các trường bên trên hay chưa.
  • $post = array() Tổng hợp các trường vào 1 mảng với cấu trúc của WordPress
  • wp_insert_post($post) Tiến hành thêm bài viết với các trường đã được nhập
  • if ($_FILES) – insert_attachment() Nếu tồn tại file ảnh thì thực hiện thêm vào ảnh đại diện

Như vậy chúng ta có File dang-bai.php đầy đủ như sau :

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
<?php if(is_user_logged_in()) {
$user_id = get_current_user_id();
$current_user = wp_get_current_user();
$vnkings $current_user->user_level;
if($vnkings <= 2) { $vnstatus = "pending"; } else { $vnstatus = "publish"; }
?>
<div id="vnkings_postBox">
    <form id="new_post" class="form-horizontal" method="post" action="" enctype="multipart/form-data">
        <div class="form-group vnking_pd col-sm-12 col-md-6">
            <label for="post_title">Tiêu đề</label>
            <input type="text" name="post_title" class="form-control" placeholder="Tiêu đề">
        </div>
        <div class="form-group vnking_pd pd_0">
          <label for="post_content">Nội Dung</label>
          <?php $post_obj = $wp_query->get_queried_object(); wp_editor( $post_obj->post_content, 'userpostcontent', array( 'textarea_name' => 'post_content' ));?>
        </div>
        <div class="form-group vnking_pd col-md-6">
          <label for="post_content">Danh mục</label>
            <?php $categories = wp_dropdown_categories("echo=0&hide_empty=0&selected=0");
                preg_match_all('/s*<option class="(S*)" value="(S*)">(.*)</option>s*/', $categories, $matches, PREG_SET_ORDER);
                echo "<select id='post_category' class='form-control' name='post_category'>";
                foreach ($matches as $match){
                echo "<option value='{$match[2]}'>{$match[3]}</option>";
                }
                echo "</select><br />n";
            ?>
        </div>
        <div class="form-group vnking_pd col-md-6">
          <label for="post_tags">Từ khóa</label>
          <input type="text" name="post_tags" class="form-control" placeholder="Từ khóa">
        </div>
        <div class="form-group">
            <p><img id="output_avatar"/></p>
            <script>
              var loadFile = function(event) {
                var output = document.getElementById('output_avatar');
                output.src = URL.createObjectURL(event.target.files[0]);
                 $('#output_avatar').addClass('active-avatar');
              };
            </script>
            <span class="btn btn-default btn-file">Hình ảnh bài viết <input class="input-file" accept="image/*" name="file" type="file" class="file" onchange="loadFile(event)">
            </span>
        </div>
        <input type="hidden" name="add_new_post" value="post" />
        <?php wp_nonce_field( 'post_nonce', 'post_nonce_field' ); ?>
        <div class="form-group">
            <div class="col-sm-12" style="padding-left:0;">
              <button type="submit" class="btn btn-primary">Đăng Bài</button>
            </div>
        </div>
    </form>
</div>
<?php if( $_SERVER['REQUEST_METHOD'] == 'POST' && !empty( $_POST['add_new_post'] ) && current_user_can('level_0') && isset( $_POST['post_nonce_field'] ) && wp_verify_nonce( $_POST['post_nonce_field'], 'post_nonce' )) {
if (isset($_POST['post_title'])) {
    $post_title = $_POST['post_title'];
}
if (isset($_POST['post_content'])) {
    $post_content = $_POST['post_content'];
}
else {
    echo 'Please enter the content';
}
if (isset ($_POST['post_category'])) {
    $post_category = $_POST['post_category'];
}
if (isset($_POST['post_tags'])) {
    $post_tags = $_POST['post_tags'];
}
$post = array(
    'post_title'    => wp_strip_all_tags($post_title),
    'post_content'  => $post_content,
    'post_category' => array($post_category),
    'tags_input'    => $post_tags,
    'post_status'   => $vnstatus,
    'post_type' => 'post',
);
$vnkings_post_id = wp_insert_post($post);
if ($_FILES) {
    foreach ($_FILES as $file => $array) {
    $newupload = insert_attachment($file,$vnkings_post_id);
    }
}
echo '<div class="alert alert-success"><strong>Bạn đã đăng bài thành công!</strong></div>';
}?>
<?php } else { ?>
<div class="formdangnhap">
    <?php wp_login_form(); ?>        
</div>
<?php } ?>

Chưa hết, bạn cần thêm 1 đoạn Function hỗ trợ đoạn thêm ảnh đại diện bài viết ở bên trên
– Thêm đoạn function này vào file Functions.php trong thư mục Theme WordPress bạn đang sử dụng:

1
2
3
4
5
6
7
8
9
10
11
function insert_attachment($file_handler,$post_id,$setthumb='false') {
    // check to make sure its a successful upload
    if ($_FILES[$file_handler]['error'] !== UPLOAD_ERR_OK) __return_false();
    require_once(ABSPATH . "wp-admin" . '/includes/image.php');
    require_once(ABSPATH . "wp-admin" . '/includes/file.php');
    require_once(ABSPATH . "wp-admin" . '/includes/media.php');
    $attach_id = media_handle_upload( $file_handler, $post_id );
 
    if ($setthumb) update_post_meta($post_id,'_thumbnail_id',$attach_id);
    return $attach_id;
}

– Cuối cùng là bạn vào Trang quản trị > Trang > Tạo trang > Đăng bài (chọn template là Đăng bài):

Tạo trang đăng bài cho thành viên wordpress không cần plugin

Sau đó bạn có thể xem kết quả với link page vừa tạo

Comments

comments