Wordpress – Fullstack Station https://fullstackstation.com Hướng dẫn lập trình, thiết kế, lập trình web, thiết kế web, lập trình javascript, lập trình fullstack từ cơ bản đến nâng cao Wed, 24 Apr 2024 08:20:25 +0000 vi hourly 1 https://wordpress.org/?v=6.4.5 https://fullstackstation.com/wp-content/uploads/2019/08/favicon.ico Wordpress – Fullstack Station https://fullstackstation.com 32 32 Tạo mật khẩu SMTP trong Amazon SES https://fullstackstation.com/tao-mat-khau-smtp-trong-amazon-ses/ https://fullstackstation.com/tao-mat-khau-smtp-trong-amazon-ses/#respond Wed, 17 Aug 2022 01:16:00 +0000 https://fullstackstation.com/?p=6853 Vào một ngày đẹp trời thiết lập gởi mail trong wordpress thì hỡi ôi làm mãi không gởi email đi được. Mãi mới xác định được là cách tạo xác thực trước đây cho SMTP bằng mật khẩu của AWS đã thay bằng Access key ID/AWS secret access key. Với cặp Access key ID/AWS secret […]

The post Tạo mật khẩu SMTP trong Amazon SES appeared first on Fullstack Station.

]]>
Vào một ngày đẹp trời thiết lập gởi mail trong wordpress thì hỡi ôi làm mãi không gởi email đi được. Mãi mới xác định được là cách tạo xác thực trước đây cho SMTP bằng mật khẩu của AWS đã thay bằng Access key ID/AWS secret access key.

Với cặp Access key ID/AWS secret access key thì sẽ được sử dụng cho Amazon SES API, nhưng các plugin dành cho wordpress thì lại không hỗ trợ, nếu có hỗ trợ thì phải sử dụng bản PRO mới có.

Vì vậy muốn sử dụng gởi email qua smtp bằng user/password thì phải “tạo mật khẩu smtp từ AWS secret access key

Bước 1: Tạo tập tin smtp_credentials_generate.py

Cứ copy rồi lưu lại thành tập tin là được, không cần chỉnh sửa gì thêm nhé.

#!/usr/bin/env python3

import hmac
import hashlib
import base64
import argparse

SMTP_REGIONS = [
    'us-east-2',       # US East (Ohio)
    'us-east-1',       # US East (N. Virginia)
    'us-west-2',       # US West (Oregon)
    'ap-south-1',      # Asia Pacific (Mumbai)
    'ap-northeast-2',  # Asia Pacific (Seoul)
    'ap-southeast-1',  # Asia Pacific (Singapore)
    'ap-southeast-2',  # Asia Pacific (Sydney)
    'ap-northeast-1',  # Asia Pacific (Tokyo)
    'ca-central-1',    # Canada (Central)
    'eu-central-1',    # Europe (Frankfurt)
    'eu-west-1',       # Europe (Ireland)
    'eu-west-2',       # Europe (London)
    'sa-east-1',       # South America (Sao Paulo)
    'us-gov-west-1',   # AWS GovCloud (US)
]

# These values are required to calculate the signature. Do not change them.
DATE = "11111111"
SERVICE = "ses"
MESSAGE = "SendRawEmail"
TERMINAL = "aws4_request"
VERSION = 0x04


def sign(key, msg):
    return hmac.new(key, msg.encode('utf-8'), hashlib.sha256).digest()


def calculate_key(secret_access_key, region):
    if region not in SMTP_REGIONS:
        raise ValueError(f"The {region} Region doesn't have an SMTP endpoint.")

    signature = sign(("AWS4" + secret_access_key).encode('utf-8'), DATE)
    signature = sign(signature, region)
    signature = sign(signature, SERVICE)
    signature = sign(signature, TERMINAL)
    signature = sign(signature, MESSAGE)
    signature_and_version = bytes([VERSION]) + signature
    smtp_password = base64.b64encode(signature_and_version)
    return smtp_password.decode('utf-8')


def main():
    parser = argparse.ArgumentParser(
        description='Convert a Secret Access Key for an IAM user to an SMTP password.')
    parser.add_argument(
        'secret', help='The Secret Access Key to convert.')
    parser.add_argument(
        'region',
        help='The AWS Region where the SMTP password will be used.',
        choices=SMTP_REGIONS)
    args = parser.parse_args()
    print(calculate_key(args.secret, args.region))


if __name__ == '__main__':
    main()

Chạy lệnh tạo mật khẩu

python path/to/smtp_credentials_generate.py wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY us-east-1

Sau khi chạy lệnh trên, chúng ta sẽ được 1 dãy ký tự mới, đó chính là mật khẩu STMP. Sử dụng Access key ID và mật khẩu được tạo ra ở trên để cài đặt trong các plugin gởi email bằng SMTP. Bên dưới là phần thiết lập cho plugin WP MAIL SMTP:

Tham khảo thêm các bài viết về Amazon SES:

https://docs.aws.amazon.com/ses/latest/dg/smtp-credentials.html

https://cuongthach.com/email-marketing/huong-dan-su-dung-amazon-ses-smtp-de-gui-email-tu-wordpress

https://vticloud.io/amazon-ses-la-gi-huong-dan-tong-hop-ve-dich-vu-amazon-ses/

The post Tạo mật khẩu SMTP trong Amazon SES appeared first on Fullstack Station.

]]>
https://fullstackstation.com/tao-mat-khau-smtp-trong-amazon-ses/feed/ 0
Cải thiện chức năng tìm kiếm trong WordPress với plugin Relevanssivà Co-Authors Plus https://fullstackstation.com/cai-thien-chuc-nang-tim-kiem-trong-wordpress-voi-plugin-relevanssiva-co-authors-plus/ https://fullstackstation.com/cai-thien-chuc-nang-tim-kiem-trong-wordpress-voi-plugin-relevanssiva-co-authors-plus/#comments Thu, 28 Mar 2019 13:06:06 +0000 http://fullstackstation.com/?p=1525 Chức năng tìm kiếm trong WordPress hoạt động kém hiệu quả, việc sử dụng plugin bên ngoài dường như là điều tất yếu. Bài viết trình bày cách sử dụng plugin Relevanssi và kết hợp với Co-Authors Plus để tìm kiếm nội dung theo tên và thông tin của tác giả một cách hiệu quả. […]

The post Cải thiện chức năng tìm kiếm trong WordPress với plugin Relevanssivà Co-Authors Plus appeared first on Fullstack Station.

]]>
Chức năng tìm kiếm trong WordPress hoạt động kém hiệu quả, việc sử dụng plugin bên ngoài dường như là điều tất yếu. Bài viết trình bày cách sử dụng plugin Relevanssi và kết hợp với Co-Authors Plus để tìm kiếm nội dung theo tên và thông tin của tác giả một cách hiệu quả.

Mặc dù Relevanssi xác nhận có hỗ trợ Co-Authors Plus (https://www.relevanssi.com/knowledge-base/relevanssi-and-co-authors-plus/) nhưng thực tế thì không hoạt động đúng như mong đợi. Mình đã tìm ra cách xử lý và chia sẽ cho ai cần.

Giới thiệu plugin Relevanssi

Có lẽ khi cần đưa ra giải pháp tìm kiếm thường mọi người hay nghĩ đến ElasticSearch, nhưng với nền tảng dựa trên nội dung có tính chất thay đổi linh hoạt cao như WordPress (ví dụ thêm bớt taxonomies chẳng hạn) hoặc số lượng nội dung không quá lớn thì việc dùng ElasticSearch cũng không hẳn mang lại hiệu quả cao. Mặc dù bạn vẫn có thể xài plugin ElasticPress https://wordpress.org/plugins/elasticpress/ để tích hợp ElasticSearch, tuy nhiên những website không đòi hỏi lập trình phức tạp, thì việc dùng ElasticSearch theo mình nhận định là vẫn không cần thiết.

Công cụ tìm kiếm mặc định của WordPress thì càng tệ, khi nó chỉ có thể tìm kiếm trong tiêu đề và phần nội dung của bài viết. Với plugin Relevanssi tích hợp chặt chẽ vào WordPress, cho phép tìm kiếm loại nội dung được chỉ định, các trường nội dung tuỳ chỉnh (custom field), hoặc các taxonomies, ngoài ra còn có nhiều tuỳ chỉnh cấu hình hữu ích khác.

Các tính năng đặc trưng:

  • Chọn loại nội dung muốn tìm kiếm
  • Chọn taxonomies muốn tìm kiếm
  • Có thể tìm kiếm trong phần bình luận, tác giả, shortcode
  • Thiết lập từ đồng nghĩa, stopwords
  • Lưu vết tìm kiếm
  • Có thể tuỳ chỉnh trích đoạn và làm nổi bật nội dung tìm kiếm
  • Có thể dùng toán tử “OR” hay “AND” tuỳ ý, với WordPress thì mặc định là “AND” vì vậy không thể tìm kiếm với từ khoá có trong nội dung và có trong term.
Chọn Taxonomies muốn tìm kiếm

Những yếu điểm của Relevanssi

Mặc dù mình đánh giá khá cao plugin Relevanssi, nhưng vẫn có những hạn chế sau:

  • Chỉ tìm kiếm được nội dung trong bảng posts, và postmeta, ngoài ra sẽ không tìm kiếm được.
  • Không tìm kiếm với các điều kiện phức tạp như tổ hợp toán tử ORAND lồng nhau.
  • Không tìm kiếm trực tiếp dạng live-search được.

Fullstack Station Tips

Các điểm yếu ở trên có thể khắc phục được nếu bạn nắm được linh hồn của plugin này chính ở bảng relevanssi, bạn hoàn toàn có thể bổ sung dữ liệu vào bảng này từ plugin khác và thay thế column `type` với tên dữ liệu của bạn. Đồng thời ở phần query thì cần chỉnh sửa thêm tuỳ theo nhu cầu thay vì sử dụng hàm của plugin thì bạn tự viết hàm query khác, dựa vào column term lấy ra doctype là có thể . Tất nhiên muốn khắc phục được theo kiểu này thì gần như phải đục vào plugin và không khuyến khích vì bạn có thể sẽ mất khả năng cập nhật từ plugin này.

Ngoài ra, mặc định plugin dùng kiểu query “%keyword” và “keyword%” nên có thể không đáp ứng nhu cầu của bạn, thì bạn có thể dùng filter bên dưới. Tất nhiên, với truy vấn “%keyword%” thì tốc độ có chậm đi đôi chút, nhưng vẫn chấp nhận được với bộ dữ liệu khoảng 2000 bài viết và 200k dòng về term được sinh ra.

/**
 * Modify relevannssi's query
 *
 * @param string $query
 * @return string
 */
function skdr_relevanssi_partial_inside_words( $query ) {
	return "(term LIKE '%#term#%')"; 
}
add_filter( 'relevanssi_fuzzy_query', 'skdr_relevanssi_partial_inside_words' );

Giới thiệu plugin Co-Authors Plus

“Đồng tác giả” là 1 chức năng thiếu sót của WordPress trong thực tế, bởi vì 1 bài viết có thể do nhiều người cùng góp sức, Co-Authors Plus ra đời để bù dắp thiếu sót này. Mặc dù số lượng “active installation” chỉ khoảng hơn 30k, nhưng mình nghĩ thực tế các dự án dùng composer để install thì sẽ nhiều hơn nữa.

Plugin này có khả năng thiết kế nội dung đặc tả cho 1 người như: họ tên, nghề nghiệp, giới thiệu, các liên kết mạng xã hội, … Plugin rất hay và được viết tốt, nhiều chức năng và có các hàm api lấy dữ liệu.

Ví dụ dưới đây về cách thêm các trường tuỳ biến:

function skdr_coauthors_guest_author_fields($fields, $groups)
{
    $additionalFields = [

        array(
            'key' => 'real_display_name',
            'label' => __('Display name', 'seikeidenron'),
            'group' => 'name',
            'required' => true,
        ),
        array(
            'key' => 'furigana',
            'label' => __('Furigana', 'seikeidenron'),
            'group' => 'name',
            'required' => true,
        ),
        array(
            'key' => 'company',
            'label' => __('Company', 'seikeidenron'),
            'group' => 'about',
        ),
        array(
            'key' => 'job_title',
            'label' => __('Job title', 'seikeidenron'),
            'group' => 'about',
        ),
        array(
            'key' => 'photo_credit',
            'label' => __('Photo credit', 'seikeidenron'),
            'placeholder' => __('Optional'),
            'group' => 'about',
        ),
    ];
    foreach ($additionalFields as $single_field) {
        if (in_array($single_field['group'], $groups) || 'all' === $groups[0] && 'hidden' !== $single_field['group']) {
            $fields[] = $single_field;
        }
    }
    //overwirte display name
    if (is_array($groups) && $groups[0] == 'name') {
        foreach ($fields as $key => $field) {
            if ($field['key'] == 'display_name') {
                $fields[$key] = [
                    // Name

                    'key' => 'display_name',
                    'label' => __('Username (Romaji only)', 'seikeidenron'),
                    'group' => 'name',
                    'required' => true,
                ];
            }
        }
    }
    return $fields;
}
add_filter('coauthors_guest_author_fields', 'skdr_coauthors_guest_author_fields', 10, 2);

Khi mình sử dụng plugin này với Relevanssi giới thiệu ở trên thì có vấn đề này sinh là Relevanssi không index được nội dung của plugin Co-Author Plus với các trường tuỳ biến tạo thêm. Vì vậy nếu bạn có sử dụng chung plugin này hoặc như các plugin khác mà bị vấn đề không index được thì làm theo cách bên dưới.


/**
 * Add additional data 
 *
 * @param array $insert_data
 * @param WP_Post $post
 * @return array
 */
function skdr_relevanssi_indexing_data($insert_data, $post){
	global $coauthors_plus;
	$authors = get_coauthors($post->ID);

	$authorIds = [];
	foreach ((array)$authors as $author){
		if (in_array($author->ID, $authorIds)) {
			continue;
		}
		$authorIds[] = $author->ID;
                //Fullstackstation.com 
                // Giả sử chúng ta có 2 thuộc tính là real_display_name và furigana được khai báo trong Co-Authors Plus
		$author_name = $author->real_display_name?$author->real_display_name:$author->display_name; 
		if(!empty($author_name) && !isset($insert_data[$author_name])){
			$insert_data[$author_name] = array("author" => 1);
		}	
		$author_furigana = $author->furigana;
		if(!empty($author_furigana) && !isset($insert_data[$author_furigana]) ){
			$insert_data[$author_furigana] = array("author" => 1);
		}
	}
	// find author data
	return $insert_data;
}
add_filter('relevanssi_indexing_data', 'skdr_relevanssi_indexing_data', 10, 2);

Ngoài ra, bạn có thể thay đổi dữ liệu với các cột bên dưới, các cột này dùng để tính điểm khi hiển thị kết quả tìm kiếm. Kết hợp với tỉ lệ/trọng số điểm được thiết lập thông số trong màn hình quản lý của plugin sẽ tạo ra điểm số tương ứng.

$fields = array( 'content', 'title', 'comment', 'tag', 'link', 'author', 'category', 'excerpt', 'taxonomy', 'customfield', 'mysqlcolumn' );

Fullstack Station Tips

Chức năng tìm kiếm là chức năng rất quan trọng, mặc dù hiện nay đa phần chúng ta thường dựa vào Google Search, nhưng việc có bộ tìm kiếm nội bộ là rất quan trọng để lọc dữ liệu tìm kiếm theo chủ ý của chúng ta. Mình đã tìm một số plugin về chức năng tìm kiếm nhưng không có cái nào làm mình hài lòng như Relevanssi, mặc dù plugin có bản trả phí hơn 100$ mỗi năm, nhưng với bản miễn phí mình nghĩ là dùng đủ. Nếu có nhu cầu về index văn bản, mình nghĩ bạn nên cân nhắc sử dụng ElasticPress với ElasticSearch.

The post Cải thiện chức năng tìm kiếm trong WordPress với plugin Relevanssivà Co-Authors Plus appeared first on Fullstack Station.

]]>
https://fullstackstation.com/cai-thien-chuc-nang-tim-kiem-trong-wordpress-voi-plugin-relevanssiva-co-authors-plus/feed/ 1