Câu hỏi:
Liệu có thể lấy permalink của trang từ slug? Tôi biết rằng permalink của trang có thể lấy được từ ID bằng cách sử dụng get_page_link():
<a href=”<?php echo get_page_link(40); ?>”>Map</a>
Tôi tò mò không biết liệu có làm được điều tương tự với slug của một trang hay không – Giống như cái này:
<a href=”<?php echo get_page_link(‘map’); ?>”>Map</a>
Sampson
Câu trả lời chính xác nhất
Bạn đang nói về các pages đúng không? Chứ không phải Posts?
Đây có phải là cái bạn đang muốn tìm:
- get_permalink( get_page_by_path( ‘map’ ) )
- get_permalink( get_page_by_title( ‘Map’ ) )
- home_url( ‘/map/’ )
Câu trả lời của zeo
Ý bạn là get_permalink(get_page_by_path(‘contact’)-> ID));? – Sampson
hmmm không? ID trong code của bạn có ý nghĩa gì? – zeo
get_page_by_path () trả về một mảng tất cả các thông tin trang (page information). get_permalink () lấy một page ID làm đối số đầu tiên. Tôi nghĩ tôi phải chuyển giá trị ID một cách rõ ràng. – Sampson
@ Jonathan: Nó không phải lúc nào cũng được ghi lại, nhưng nhiều hàm WP chấp nhận cả dạng số của ID và toàn bộ post objects như là các đối số. – Jan Fabry
Có vẻ như get_page_by_path () khá phức tạp khi sử dụng để xử lý các trang con. – Kaaviar
Tôi đồng ý với Kaaviar, hàm ở phía dưới trông tốt hơn. – Rezen
Tôi có sử dụng hàm số 1 cho các trang con của tôi mà không có vấn đề gì. Tôi thực sự không thấy nó phức tạp. – Jeremy
home_url (‘/ map /’) Tôi thấy cái này hoạt động rất tốt – shady sherif
Đây là một câu trả lời sai, xin hãy downvote. Đường dẫn không giống slug. Ví dụ: một trang có trang mẹ được gọi là abc, bản thân trang đó có một slug 123. Đường dẫn bây giờ là abc/123 slug là 123. Vui lòng xóa câu trả lời sai này. get_page_by_path ( ‘123’ ) sẽ không hoạt động. – Toskan
Tôi nghĩ cái này sẽ tốt hơn:
function get_page_by_slug($page_slug, $output = OBJECT, $post_type = ‘page’ ) {
global $wpdb;
$page = $wpdb->get_var( $wpdb->prepare( “SELECT ID FROM $wpdb->posts WHERE post_name = %s AND post_type= %s”, $page_slug, $post_type ) );
if ( $page )
return get_page($page, $output);
return null;
}
Hãy xem mẫu của bản gốc get_page_by_title của WordPress. (dòng 3173)
Câu trả lời của Matheus Eduardo
Tại sao cái này lại tốt hơn? Bạn có thể giải thích được không? – julien_c
Bình luận cuối cùng – Tôi nghĩ rằng sql cần phải có thêm một điều kiện:function get_page_by_slug($page_slug, $output = OBJECT, $post_type = ‘page’ ) { global $wpdb; $page = $wpdb->get_var( $wpdb->prepare( “SELECT ID FROM $wpdb->posts WHERE post_name = %s AND post_type= %s AND post_status = ‘publish'”, $page_slug, $post_type ) ); if ( $page ) return get_page($page, $output); return null; } – user25790
Tại sao? Nó không tạo ra một đối tượng bài viết hoàn chỉnh chỉ để lấy ID. – s_ha_dum
@webcitron Tôi nghĩ rằng nó chỉ giống như mẫu gốc của WordPress, lấy post bởi ‘title’, và chỉ cần thay đổi cho ‘slug’. (hãy xem trong link) – Matheus Eduardo
Đây là một câu trả lời hay. Điều này bỏ qua khả năng của một plugin giả mạo che giấu trang của bạn hoặc lọc không chính xác. Nếu bạn trả về id từ bảng bài đăng (post table), thì bạn có thể tạo một ví dụ của \ WP_Post từ đó, và nó giải quyết trực tiếp trong tất cả các hàm WordPress dùng để kiểm tra các giá trị khác. \ WP_Post cũng cung cấp các phương thức trực tiếp để tìm dữ liệu liên quan nhất về bài đăng. – mopsyd
Đây là một phương pháp được published bởi Tom McFarlin trên blog của anh ấy:
/**
* Returns the permalink for a page based on the incoming slug.
*
* @param string $slug The slug of the page to which we’re going to link.
* @return string The permalink of the page
* @since 1.0
*/
function wpse_4999_get_permalink_by_slug( $slug, $post_type = ” ) {// Initialize the permalink value
$permalink = null;// Build the arguments for WP_Query
$args = array(
‘name’ => $slug,
‘max_num_posts’ => 1
);// If the optional argument is set, add it to the arguments array
if( ” != $post_type ) {
$args = array_merge( $args, array( ‘post_type’ => $post_type ) );
}// Run the query (and reset it)
$query = new WP_Query( $args );
if( $query->have_posts() ) {
$query->the_post();
$permalink = get_permalink( get_the_ID() );
wp_reset_postdata();
}
return $permalink;
}
Nó hoạt động tốt đối với custom post types và built-in post types (loại bài đăng dựng sẵn) (như post và page).
Câu trả lời của shea
Câu trả lời đã được chấp nhận là sai bởi vì các trang phân cấp (hierarchical pages) không hoạt động như thế. Nói một cách đơn giản, slug không phải lúc nào cũng là đường dẫn của trang hoặc bài đăng. Ví dụ: trang của bạn có một trang con, đường dẫn sẽ là parent-slug/child-slug và get_page_by_path sẽ không tìm được child-slug theo cách này. Giải pháp thích hợp là:
function mycoolprefix_post_by_slug($the_slug, $post_type = “page”){
$args = array(
‘name’ => $the_slug,
‘post_type’ => $post_type,
‘post_status’ => ‘publish’,
‘numberposts’ => 1
);
$my_page = get_posts($args)[0];
return $my_page;
}<a href=”<?php echo mycoolprefix_post_by_slug(‘map’); ?>”>Map</a>
Câu trả lời của Toskan
function theme_get_permalink_by_title( $title ) {
// Initialize the permalink value
$permalink = null;// Try to get the page by the incoming title
$page = get_page_by_title( strtolower( $title ) );// If the page exists, then let’s get its permalink
if( null != $page ) {
$permalink = get_permalink( $page->ID );
} // end ifreturn $permalink;
} // end theme_get_permalink_by_title
Dùng hàm này bằng cách
if( null == theme_get_permalink_by_title( ‘Register For This Site’ ) ) {
// The permalink doesn’t exist, so handle this however you best see fit.
} else {
// The page exists, so do what you need to do.
} // end if/else
Câu trả lời của user46487
Hãy thử cái này:
<a href=”<?php echo get_page_link( get_page_by_path( ‘map’ ) ); ?>”>Map</a>
get_page_by_path( ‘path’ ) trả về đối tượng page/post, sau đó nó có thể được sử dụng bởi get_page_link(). Bởi vì nó chấp nhận cả đối tượng post và page rồi trả về permalink.
Câu trả lời của Sigma Wadbude
Hãy chỉnh sửa câu trả lời của bạn và thêm vào một lời giải thích: Tại sao cái đó lại có thể giải quyết được vấn đề? – fuxia