Yanıtlar:
Global değişkeni kullanın $post
:
<?php
global $post;
$post_slug = $post->post_name;
?>
echo
var. Yani, bu ideal olacaktır:<?php global $post; echo $post->post_name; ?>
$WP_Post
?
Diğer cevaplara göre, sümüklü böcek post_name
mülkte saklanır . O iken olabilir doğrudan erişilebilir, ben (kapatacağı) tercih get_post_field()
onlar için doğru API sonrası özelliklerini erişmek için işlev.
Açıkça sağlanan gönderiyi gerektirir ve mevcut yazıya varsayılan olarak gelmez, dolayısıyla geçerli yazı için tam olarak şöyle olacaktır:
$slug = get_post_field( 'post_name', get_post() );
Daha fazla güvenilirlik için kazıdan sonra, bu cevabı şu düzenlemeye götüren aşağıdaki yazıya yaptım : ( Bunu kontrol ettiğinizden emin olun )
Bugüne kadar bulabildiğim en güvenilir yöntem aşağıdaki gibidir:
// Get the queried object and sanitize it
$current_page = sanitize_post( $GLOBALS['wp_the_query']->get_queried_object() );
// Get the page slug
$slug = $current_page->post_name;
Bu şekilde, her seferinde doğru veriyi aldığınızdan% 99.9999 emin olursunuz.
Bu soruna bir diğer daha güvenli alternatif get_queried_object()
, post_name
mülkiyet tarafından tutulan sayfa fişini almak için mevcut sorgulanan nesneyi tutanı kullanmaktır . Bu, şablonunuzun herhangi bir yerinde kullanılabilir.
$post
kullanılabilir, ancak herhangi bir özel sorgu veya özel kodun değerini değiştirebileceği için güvenilmez olabilir $post
, bu nedenle döngü dışından kaçınılmalıdır.
Kullanılması get_queried_object()
Geçerli sayfa nesnesini almak için çok daha güvenilir olduğunu ve kötülüğü kullandığınız sürece, değiştirilemez olasılığı daha düşüktür query_posts
ana sorgu nesnesi kırar, ama sonra hepsi size kalmış.
Yukarıdaki gibi kullanabilirsiniz
if ( is_page() )
$slug = get_queried_object()->post_name;
query_posts
bunun kötü olmadığını söylemeliyim, bununla birlikte genellikle sık sık kullanmazsınız ve yanlış kullanılır :)
Kod örneği göz önüne alındığında, gerçekten ihtiyacınız olan bir bağlantı gibi görünüyor. Bu durumda, döngünün dışında kullanılabilecek get_permalink () işlevini kullanabilirsiniz . Bu, sümüklü böcek kullanmaktan daha güvenilir bir şekilde ihtiyacınız olanı yapmalı.
Eski bir soru olabilir, ancak cevaplarınıza göre get_the_slug () ve the_slug () fonksiyonlarını oluşturdum.
if ( !function_exists("get_the_slug") ) {
/**
* Returns the page or post slug.
*
* @param int|WP_Post|null $id (Optional) Post ID or post object. Defaults to global $post.
* @return string
*/
function get_the_slug( $id = null ){
$post = get_post($id);
if( !empty($post) ) return $post->post_name;
return ''; // No global $post var or matching ID available.
}
/**
* Display the page or post slug
*
* Uses get_the_slug() and applies 'the_slug' filter.
*
* @param int|WP_Post|null $id (Optional) Post ID or post object. Defaults to global $post.
*/
function the_slug( $id=null ){
echo apply_filters( 'the_slug', get_the_slug($id) );
}
}
Sümüklüböceği halkanın dışına almak istediğinizde kullanılacak fonksiyon budur.
get_post_field( 'post_name');
Burada bulunan cevabı: WordPress'te Güncel Sayfayı Nasıl Almalı?
Sadece @Matthew Boynes cevabını daha ileri götürün, eğer ebeveyn sümüklü böcek (eğer varsa) almakla ilgileniyorsanız, bu fonksiyonu faydalı buldum:
function mytheme_get_slugs() {
if ( $link = get_permalink() ) {
$link = str_replace( home_url( '/' ), '', $link );
if ( ( $len = strlen( $link ) ) > 0 && $link[$len - 1] == '/' ) {
$link = substr( $link, 0, -1 );
}
return explode( '/', $link );
}
return false;
}
Örneğin sümüklü böcekleri ana sınıfa eklemek için:
function mytheme_body_class( $classes ) {
if ( $slugs = mytheme_get_slugs() ) {
$classes = array_merge( $classes, $slugs );
}
return $classes;
}
add_filter( 'body_class', 'mytheme_body_class' );
Daha fazla başlık altında bir cevap istiyorsanız, daha önce hiç kanca kullanılmamış olsa bile, herhangi bir zamanda mesaj, sayfa veya özel taksonomi olan tüm gönderileri almak için aşağıdaki SQL sorgusunu kullanabilirsiniz.
Ham SQL:
SELECT `id`, `post_type` AS `type`, `post_author` AS `author`, `post_name` AS
`slug`, `post_status` AS `status`
FROM wp_posts
WHERE `post_type` NOT IN ('attachment', 'nav_menu_item', 'revision')
AND `post_status` NOT IN ('draft', 'trash')
ORDER BY `id`;
Bu bile önce, hatta fonksiyonları dosyanın ilk satırında çalışan mu_plugins_loaded
veya init
kancalar.
@Not
Bu, standart bir veritabanı önekine sahip olduğunuz varsayılmaktadır wp_posts
. Değişken önekleri hesaba katmanız gerekirse, aşağıdakileri yaparak PHP ile doğru posta tablosunu kolayca alabilirsiniz:
<?php
global $wpdb;
$table = $wpdb->posts;
$query = "SELECT `id`, `post_type` AS `type`, `post_author` AS `author`, `post_name` AS
`slug`, `post_status` AS `status`
FROM " . $table . "
WHERE `post_type` NOT IN ('attachment', 'nav_menu_item', 'revision')
AND `post_status` NOT IN ('draft', 'trash')
ORDER BY `id`;"
Sonra biriyle çalışacak $wpdb
, mysqli
ya da bir PDO
örneği. Bu sorguda kullanıcı girişi olmadığından, içine herhangi bir değişken enjekte etmediğiniz sürece hazırlanmış bir ifade olmadan çalışmak güvenlidir.
Bunu bir sınıfın özel statik değeri olarak saklamanızı öneririm, böylece en iyi performans için sorguyu sayfa başına bir defadan fazla tekrar ateşlemek zorunda kalmadan erişilebiliyor:
class Post_Cache
{
private static $post_cache;
public function __construct()
{
//This way it skips the operation if it's already set.
$this->initCache();
}
public function get($id, $type = null)
{
if ( !(is_int( $id ) && array_key_exists( $id, self::$post_cache ) ) )
return false;
}
if ( !is_null( $type ) )
{
//returns the specific column value for the id
return self::$post_cache[$id][$type];
}
//returns the whole row
return self::$post_cache[$id];
}
private function initCache()
{
if ( is_null(self::$post_cache) )
{
$query = "...";
$result = some_query_method($query); //Do your query logic here.
self::$post_cache = $result;
{
}
}
kullanım
$cache = new \Post_Cache();
//Get the page slug
$slug = $cache->get( get_the_ID(), 'slug');
if ($cache->get( get_the_ID() ))
{
//post exists
} else {
//nope, 404 'em
}
if ( $cache->get( get_the_ID(), 'status') === 'publish' )
{
//it's public
} else {
//either check current_user_can('whatever_permission') or just 404 it,
//depending whether you want it visible to the current user or not.
}
if ( $cache->get( get_the_ID(), 'type') === 'post' )
{
//It's a post
}
if ( $cache->get( get_the_ID(), 'type') === 'page' )
{
//It's a page
}
Sen özü aldın. Daha fazla ayrıntıya ihtiyaç duyarsanız, normalnew \WP_Post( get_the_ID() );
Bu, wordpress döngüsü isteğinizi kabul edilebilir bulduğu bir noktaya ulaşmasa bile mesajları istediğiniz zaman kontrol etmenizi sağlar. Bu, Wordpress çekirdeğinin kendisi tarafından çalıştırılan aynı sorgunun biraz daha optimize edilmiş bir sürümüdür. Bu, iade edilmesini istemediğiniz önemsiz tüm filtreleri filtreler ve ilgili yazar kimliği, posta türü, sümüklü böcek ve görünürlük ile ilgili size güzel bir şekilde düzenlenmiş bir liste sunar. Daha fazla ayrıntıya ihtiyaç duyuyorsanız, bunları normal olarak alabilir new \WP_Post($id);
veya diğer yerel Wordpress işlevlerinden herhangi birini, ilgili tablo satırlarından herhangi biriyle, hatta döngünün dışında bile kullanabilirsiniz.
Kendi özel temalarım ve eklentilerimden birkaçında benzer bir kurulum kullanıyorum ve çok iyi çalışıyor. Aynı zamanda güvenlidir ve Wordpress'teki çoğu şey gibi geçersiz kılınabileceği global kapsamda dolaşan dahili verileri bırakmaz.
WordPress'te Dinamik Sayfa çağırma.
<?php
get_template_part('foldername/'.basename(get_permalink()),'name');
?>
<?php global $post; $post_slug=$post->post_name; echo $post_slug; ?>