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.8.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
Docker thực chiến: môi trường phát triển https://fullstackstation.com/docker-thuc-chien-moi-truong-phat-trien/ https://fullstackstation.com/docker-thuc-chien-moi-truong-phat-trien/#comments Fri, 10 May 2019 08:58:11 +0000 http://fullstackstation.com/?p=1540 Có lẽ với bạn bây giờ Docker không còn quá xa lạ (đọc Docker là gì nếu bạn chưa biết) , nhiều người đã sử dụng trong môi trường sản phẩm và trong môi trường phát triển. Mặc dù vậy, docker cũng không phải dễ dàng tiếp cận và sử dụng, nếu bạn vẫn chưa […]

The post Docker thực chiến: môi trường phát triển appeared first on Fullstack Station.

]]>
Có lẽ với bạn bây giờ Docker không còn quá xa lạ (đọc Docker là gì nếu bạn chưa biết) , nhiều người đã sử dụng trong môi trường sản phẩm và trong môi trường phát triển. Mặc dù vậy, docker cũng không phải dễ dàng tiếp cận và sử dụng, nếu bạn vẫn chưa sử dụng docker vì 1 lý do nào đó, bài viết này sẽ dành cho bạn: docker thực chiến thiết lập môi trường phát triển một cách dễ dàng.

Tại sao nên xài docker

Thú thật, mình cũng từng như bạn, không chịu rời bỏ cái môi trường lập trình đang chạy ngon lành trên máy của mình, cho đến một ngày…Đơn giản là đời làm lập trình có nhiều dự án, mỗi dự án yêu cầu môi trường, cấu hình khác nhau, rồi môi trường lập trình trên máy cũng khác. Ví dụ, trên máy dùng VSCode dùng phần rộng PHP đòi phải PHP 7, nhưng dự án A chỉ chạy trên 5.6, dự án B chỉ chạy trên PHP 7.2. Ngoài ra còn có nhiều tổ hợp công nghệ như kết hợp với Mysql hay Postgres, Elasticsearch…không phải mọi thứ đều cài lên máy chạy cùng lúc rất cực để quản lý và không hiệu quả.

Ngoài ra, một số thư viện cài đặt thỉnh thoảng có trục trặc với máy vì phải build lại, việc các thư viện chỉ chạy trên một vài version tương thích thường xuyên xảy ra. Điều này khiến cho bạn mất khá nhiều thời gian cho việc quản lý môi trường lập trình của mình, đây là điều nên tránh, hãy tập trung năng lượng cho công việc chính, còn môi trường phát triển hãy để docker lo.

Giới thiệu Lando

Dev With Lando

Lando là một nền tảng miễn phí, mã nguồn mở, đa nền tảng dựa trên docker dành cho lập trình viên, cải thiện môi trường làm việc bằng cách gom tổ hợp công nghệ bạn sử dụng thành 1 file cấu hình, thiết lập môi trường lập trình dễ dàng hơn bao giờ hết.

Homepage: https://devwithlando.io

Nói một cách ngắn gọn, nếu bạn biết WAMP hoặc MAMP, thì Lando là ông nội của 2 thằng này. Ví dụ lập trình

Các tổ hợp, ngôn ngữ đã được hỗ trợ

Ngôn ngữ

Các ngôn ngữ sau đã được hỗ trợ:

Tổ hợp

Các tổ hợp đã được cấu hình sẵn:

Các dịch vụ

Các dịch vụ sau cũng được hỗ trợ:

Tại sao nên dùng Lando

Nếu bạn tìm thấy một trong các công nghệ, dịch vụ, ngôn ngữ lập trình được hỗ trợ và liệt kê ở trên “quen thuộc” với công việc hàng ngày của mình, thì bạn đã có lý do sử dụng Lando.

Như ví dụ mình có nói ở trên, việc có nhiều dự án quả thật là rất phức tạp để quản lý môi trường lập trình. Mình đảm nhiệm các dự án trong công ty từ nhỏ đến lớn với các ngôn ngữ như Go, Python, Nodejs, PHP thì Go và Python là ít gặp trục trặc nhưng PHP thì nhiều, và nhiều nhất là Nodejs vì Nodejs ra phiên bản mới liên tục. Dự án cũ 2,3 năm trước thì xài công nghệ, phiên bản cũ tới lúc mình cập nhật máy và thư viện liên quan thì khi quay lại dự án cũ nó không chạy :((. Và mất thời gian chỉnh sửa môi trường làm việc như vậy vài lần, đến mức độ mình thấy sợ. Từ khi có Lando, khi muốn chạy dự án nào, chỉ cần: `lando start` là xong.

Các tính năng nổi bật của Lando:

  • Sao chép tương tự môi trường production cho máy bạn
  • Quy chuẩn hoá mọi trường lập trình của đội ngũ đa nền tảng OSX, Window, Linux
  • Tuỳ chỉnh hoặc mở rộng công cụ, cấu hình triển khai
  • Chạy CI test trên máy của bạn.
  • Sử dụng môi trường duy nhất cho tất cả các dự án
  • Tích hợp với nhà cung cấp dịch vụ hosting như Pantheon

Mặc dù bạn có thể nhận ra là Docker Compose cũng có tính năng tương tự, tuy nhiên có một vài sự khác biệt:

  • Lando là một lớp trừu tượng đã làm giảm bớt tính phức tạp khi cấu hình các container bằng cách sử dụng “công thức” (recipes) cho một số stack phổ biến.
  • Lando cung cấp nhiều phương thức giúp lập trình viên chạy những dòng lệnh phức tạp, các bước build, … và tự động hoá các dịch vụ mà không cần tinh chỉnh Dockerfiles
  • Lando quản lý một số tác vụ cài đặt phức tạp được yêu cầu để có một Docker Composer tốt như proxy, nice urls, cross-application netwroking.
  • Ngoài ra, bạn vẫn có thể tuỳ biến dễ dàng Docker Compose.

Nói 1 cách khác, Lando đã giúp đơn giản hoá Docker Compose cho một số tác vụ, stack phổ biến. Chỉ cần 1 câu lệnh, các dịch vụ đi kèm đều được khởi tạo, mất chưa đầy 2 phút là bạn có thể chạy được stack.

Bắt tay vào thực hành Lando

Mình không muốn nói phần này nhiều, chỉ cần sau khi bạn cài đặt Docker, Lando thì bạn chỉ mất 5 phút để tạo 1 dự án WordPress, Laravel, Drupal, Joomla hay LAMP, LEMP bất kỳ chỉ việc sử dụng công thức đã liệt kê ở trên.

5 phút đơn giản chỉ là tạo cái file .lando.yml, đây là file mẫu dùng cho WordPress (dùng với Bedrock/Sage sẽ được giới thiệu ở bài khác)

name: seikeidenron
recipe: wordpress
proxy:                
  nginx:              # Tuỳ chọn: nếu bạn bỏ qua cấu hình này thì Lando sẽ chạy ở seikeidenron.lndo.site
    - seikeidenron.localhost
  theme:              # Tuỳ chọn: ở đây mình phát triển thêm theme của wordpress thì sẽ cần tới node
    - localhost:3000
config:
  php: '7.2'
  via: nginx
  webroot: web
  database: mariadb
  xdebug: true

# Đoạn này cần để thiết lập node
services:
  theme:
    type: node
    services:
      ports:
        - 3000:3000
tooling:
  yarn:
    service: theme

Xong file trên thì chỉ cần lando start là mọi thứ chạy, quá nhanh quá nguy hiểm.

Fullstack Station Tips

Các công thức có sẵn đa phần đều có phần database riêng lẻ, tuy nhiên nếu các dự án của bạn đều sử dụng mysql chẳng hạn, thì hãy sử dụng database server của máy bạn, chứ không phải database server của docker. Như vậy thì việc sử dụng Lando sẽ trở nên nhanh chóng hơn, nhất là đối với các dự án đang giai đoạn lập trình. Ở phần kết nối db thì thay vì bạn dùng localhost thì hãy đổi thành host.docker.internal, đây chính là máy host, máy chính của bạn.

The post Docker thực chiến: môi trường phát triển appeared first on Fullstack Station.

]]>
https://fullstackstation.com/docker-thuc-chien-moi-truong-phat-trien/feed/ 1
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