Як я можу отримати молдинг поточної сторінки?


99

Я намагаюся витягнути слуп поточної сторінки WordPress поза циклом. Заголовок сторінки повертається разом wp_title (), але як я можу отримати слизьку?

<li>
  <a href="/slug-of-current-page/">
    <?php wp_title('', true); ?>
  </a>
</li>

Відповіді:


151

Використовуйте глобальну змінну $post:

<?php 
    global $post;
    $post_slug = $post->post_name;
?>

3
Дякую. Ваше рішення чудово працює. Просто потрібно перегукувати <?php global $post; $post_slug=$post->post_name; echo $post_slug; ?>
слизу

1
Як сказав саріташ, вам це потрібно echo. Отже, це було б ідеально:<?php global $post; echo $post->post_name; ?>
its_me


68

Відповідно до інших відповідей, слизь зберігається у post_nameвластивості. Хоча до нього можна отримати доступ безпосередньо, я віддаю перевагу функції (недостатньо використаної) get_post_field()для доступу до властивостей публікацій, які не мають належного API для них.

Він вимагає публікації, яка надається явно і не є типовою для поточної, тому повністю для поточної публікації це буде:

$slug = get_post_field( 'post_name', get_post() );

12
Варто зазначити, що якщо ви знаходитесь у циклі, ви можете використовувати get_post_fieldбез другого аргументу ( docs )
jmarceli

26

РЕДАКЦІЯ 5 КВІТНЯ 2016 року

Після копання для отримання більшої надійності я закінчила цю відповідь на наступну публікацію, яка веде до цього редагування: ( Не забудьте перевірити це )

Найнадійніший метод, який я могла придумати, - це:

// 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;

Таким чином, ви на 99.9999% впевнені, що отримуєте правильні дані щоразу.

ОРИГІНАЛЬНИЙ ВІДПОВІДЬ

Ще одна безпечніша альтернатива цій проблемі - це використання, get_queried_object()яке утримує поточний запитуваний об'єкт, щоб отримати слиз сторінки, яку утримує post_nameвластивість. Це можна використовувати будь-де у вашому шаблоні.

$postможе бути використаний, але він може бути ненадійним, оскільки будь-який спеціальний запит або спеціальний код може змінити значення $post, тому його слід уникати за межами циклу.

Використання get_queried_object()для отримання об’єкта поточної сторінки набагато надійніше і менша ймовірність змінити, якщо ви не використовуєте зло, query_postsяке порушує головний об’єкт запиту, але тоді все залежить від вас.

Ви можете використовувати вищезазначене, як описано далі

if ( is_page() )
    $slug = get_queried_object()->post_name;

Треба сказати, що query_postsце не зло, коли ви хочете змінити основний запит , який, однак, ви зазвичай не робите і часто не зловживаєте :)
jave.web

11

Найпростіший спосіб отримати слизу:

<?php echo basename(get_permalink()); ?>

2
це залежить від налаштувань постійної посилання. Якщо ви використовуєте "просту" настройку, посилання будуть мати вигляд http://domain/?p=123, залишаючи вас ?p=123.
Мене

8

Зважаючи на приклад коду, схоже, що вам справді потрібно посилання. У цьому випадку ви можете використовувати get_permalink () , який можна використовувати поза циклом. Це повинно робити те, що вам потрібно надійніше, ніж використання поштового слима.


4
Це повна URL-адреса, але не лише кулі.
Фред

2

Це може бути старе питання, але я створив функції get_the_slug () та the_slug () на основі ваших відповідей.

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) );
    }
}


0

Далі на відповідь @Matthew Boynes, якщо ви зацікавлені в тому, щоб отримати батьківського слима (якщо він є), то я вважаю цю функцію корисною:

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;
}

Наприклад, щоб додати слизи (и) до класу тіла:

function mytheme_body_class( $classes ) {
    if ( $slugs = mytheme_get_slugs() ) {
        $classes = array_merge( $classes, $slugs );
    }
    return $classes;
}
add_filter( 'body_class', 'mytheme_body_class' );

0

Якщо ви хочете отримати більше відповідей, що не знаходяться під капотом, ви можете використовувати наступний SQL-запит, щоб отримати будь-які повідомлення, що є або публікаціями, сторінками, або користувацькими таксономіями в будь-який час, навіть якщо жоден гачок ще не вистрілив.

Сирий 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`;

Це працює навіть у першому рядку файлу ваших функцій, навіть перед гачками mu_plugins_loadedабо initгачками.

@Примітка

Це за умови, що у вас є стандартний префікс бази даних wp_posts. Якщо вам потрібно врахувати змінні префікси, ви можете отримати правильну таблицю пошти через PHP досить легко, виконавши наступні дії:

<?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`;"

Потім запустіть або $wpdb, mysqliабо , PDOнаприклад. Оскільки в цьому запиті немає вводу користувача, його можна запустити без підготовленого оператора, доки ви не введете в нього жодних змінних.

Я б запропонував зберігати це як приватне статичне значення класу, так що до нього можна отримати доступ, не потребуючи повторного запиту повторно на сторінку для найкращої продуктивності, приблизно так:

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;
        {
    }
}

Використання

$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
}

Ви отримуєте суть. Якщо вам потрібні додаткові деталі, ви можете їх отримати, як зазвичайnew \WP_Post( get_the_ID() );


Це дозволить перевірити публікації в будь-який час, навіть якщо цикл wordpress не потрапив у точку, коли він вважає ваш запит прийнятним. Це трохи оптимізована версія того ж запиту, яку виконує саме ядро ​​Wordpress. Цей фільтрує всі непотрібні повернення, які ви не хотіли б повернути, і просто дає вам упорядкований список із відповідним ідентифікатором автора, типом публікації, слизом та видимістю. Якщо вам потрібні додаткові деталі, ви можете отримати їх, як зазвичай new \WP_Post($id);, або використовувати будь-яку з інших функцій Wordpress за допомогою будь-якого з відповідних рядків таблиці, навіть поза межами циклу.

Я використовую подібні налаштування в парі власних власних тем і плагінів, і це працює чудово. Це також безпечно і не залишає внутрішніх даних плавати навколо у глобальному масштабі, де їх можна перекрити, як і більшість речей у Wordpress.


0

Я, чесно кажучи, не розумію, чому жодна з відповідей просто не робить:

global $wp;
$current_slug = $wp->request;

// Given the URL of https://example.com/foo-bar
if ($current_slug === 'foo-bar') {
  // the condition will match.
}

Це працює для всіх публікацій, сторінок, користувацьких маршрутів.


-1

Динамічний виклик сторінки в WordPress.

<?php
    get_template_part('foldername/'.basename(get_permalink()),'name');
    ?>
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.