Я хочу створити користувальницький slug в WordPress і вивести JSON. Як це зробити?

У мене є масив:

 $cats = array('Hobbes', 'Simba', 'Grumpy Cat');

Я хотів би створити спеціальну кінцеву точку під назвою " http://example.com/cats ". Щоразу, коли ви відвідуєте цю URL-адресу, виведіть її як JSON:

 header('Content-Type: application/json');
 $cats = array('Hobbes', 'Simba', 'Grumpy Cat');
 echo json_encode($cats);

Ідеально створюючи їх на льоту в functions.php. Так створюються "/ собаки" або "/ птахи".

5
Ви можете прийняти відповідь з правилами перезапису та користувацькою кінцевою точкою;)
додано Автор kaiser, джерело

6 Відповіді

Це підхід до додавання правила перезапису для заміни шаблону, який WP хоче виконати (зазвичай шаблон 404) з чимось іншим. У вашому випадку ви просто бажаєте померти з деякими даними JSON, тому є багато різних способів зробити це. Це підхід "за книгою" для додавання правила перезапису замість рубати, щоб перевірити URL-адресу самостійно. Відправляючи цю статтю в тому випадку, якщо хтось повинен побачити, як це можна зробити, щоб поміняти шаблон або з деякими закодованими даними.

<?php

function cats_rewrite() {
    add_rewrite_rule( 'cats/(.*)/?', 'index.php?cats=$matches[1]', 'top' );
}
add_action( 'init', 'cats_rewrite' );

function filter_query_vars( $query_vars ) {
    $query_vars[] = 'cats';

    return $query_vars;
}
add_filter( 'query_vars', 'filter_query_vars' );

function my_template_include( $template ) {
    global $wp_query;

   //You could normally swap out the template WP wants to use here, but we'll just die
    if ( isset( $wp_query->query_vars['cats'] ) && ! is_page() && ! is_single() ) {
        $wp_query->is_404 = false;
        $wp_query->is_archive = true;
        $wp_query->is_category = true;
        $cats = array( 'Hobbes', 'Simba', 'Grumpy Cat' );
        header( 'Content-Type: application/json' );
        die( json_encode( $cats ) );
    } else {
        return $template;
    }
}
add_filter( 'template_include', 'my_template_include' );

Important: don't forget to flush your permalink settings. Just visit (Admin) Settings > Permalinks. You don't even need to click save as the rewrite settings are "flushed" when you visit the admin page.

7
додано
Це має бути обрана відповідь. Тим не менш, я пропоную використовувати для цього спеціальний код ENDPOINT .
додано Автор kaiser, джерело
Я можу просто вказати вам на SERPs для кінцевих точок. Коротше кажучи, мова йде про останню частину URl, як http://example.com/author/json . Ви можете додати кінцеві точки до всього (додати вивід JSON для кожного типу запиту) або лише до певних (наприклад, EP_AUTHOR , наприклад).
додано Автор kaiser, джерело
Касьє, дбайте про розробку? Щасливий, щоб поміняти вибрану відповідь
додано Автор D. Sewell, джерело

Можна використовувати pre_get_posts як запропоновано, але просто перевірте глобальний об'єкт $ wp для URL-адреси запиту .. так:

add_action( 'pre_get_posts', function ($query ){
    global $wp;

    if ( !is_admin() && $query->is_main_query() ) {
        if ($wp->request == 'cats'){
            header('Content-Type: application/json');
            $cats = array('Hobbes', 'Simba', 'Grumpy Cat');
            echo json_encode($cats);
            exit;
        }
    }
});

(PHP 5.3+ у цьому прикладі)

Note 1: The $query->is_main_query() test is important as it will prevent it from running again in subsequent context of WP_Query instances (eg. if you use a WP_Query to fetch your list of cats, you will end up with an infinite nested loop). is_admin() isn't critical but it's a good practice to use.

Note 2: Wordpress seems to trim trailing slashes in request so this works for /cats & /cats/ the same way

Note 3: You must exit; in your handler otherwise it will keep executing the regular wordpress workflow and likely show a 404 page.

3
додано
Додано кілька записок про код
додано Автор freddy6, джерело
Це динаміт ... Я думаю, що це таке.
додано Автор D. Sewell, джерело
Для вашого запиту я використовую ".cats", щоб уникнути конфліктів з URI. Він чудово працює.
додано Автор D. Sewell, джерело

Найпростіший спосіб, я можу подумати (а єдиний) - створити сторінку з постійною посиланням, яку ви вказуєте, створити власний шаблон у папці теми, скажімо, це json_output.php з таким вмістом:

<?php
/*
* Template Name: JSON Output
*/
header('Content-Type: application/json');
$cats = array('Hobbes', 'Simba', 'Grumpy Cat');
echo json_encode($cats);

При створенні сторінки в WordPress адміністратора, виберіть свій новий створений шаблон, в цьому випадку він повинен бути названий JSON Output

enter image description here

There you go, publish the page and you'll get what you want: enter image description here

Сподіваюся, що це допоможе

3
додано
Це не відповідає вимогам functions.php, але це найкраще рішення з точки зору продуктивності та технічного обслуговування.
додано Автор xyz, джерело
Так, я хотів би, щоб це було в functions.php. Спасибі хоч
додано Автор D. Sewell, джерело

Мені здається, ви можете використовувати галочку дії pre_get_posts, щоб змінити запит, але він відчуває себе трохи рубати. У будь-якому випадку, щось подібне?

add_action( 'pre_get_posts', 'cats_endpoint' );

function cats_endpoint($query ){
  if ( !is_admin() && $query->is_main_query() ) {
    if ($query->query_vars['post_type'] == 'cats'){
      header('Content-Type: application/json');
      $cats = array('Hobbes', 'Simba', 'Grumpy Cat');
      echo json_encode($cats);
      exit;
     }
  }
}

майте на увазі, що pre_get_posts виконується для кожного запиту сторінки. Крім того, вам може знадобитися зареєструвати кішки post_type (якщо вона не працює з коробки).

1
додано
@envysea не впевнений, вам доведеться. Але визначте "на льоту". чому ви взагалі інтегруєте його в тему WP? чому б не вказати користувальницький скрипт PHP, який отримує параметр і виводить, що вам потрібно?
додано Автор xyz, джерело
Кішки не є типом повідомлення. Я хочу створити ці жорсткі URL-адреси на льоту
додано Автор D. Sewell, джерело
На льоту, мається на увазі жорсткий закодований
додано Автор D. Sewell, джерело
Це те ж саме, що і моє рішення, але набагато чистіше. (хоча я б все-таки використовував гачок parse_request замість pre_get_posts)
додано Автор koraytaylan, джерело

Я впевнений, що є кращі способи зробити це, але я б додав це до functions.php…

add_action('parse_request', 'json_cats');
function json_cats() {
  if(!empty($_SERVER['REQUEST_URI']) || isset($_SERVER['argv'])) {
    $urlvars = explode('/', $_SERVER['REQUEST_URI']);
    if( ( isset($_SERVER['argv']) && count($_SERVER['argv']) > 1 && $_SERVER['argv'][1] == 'cats' ) || ( count($urlvars) > 1 && $urlvars[1] == 'cats' ) ) {
      header('Content-Type: application/json');
      $cats = array('Hobbes', 'Simba', 'Grumpy Cat');
      echo json_encode($cats);
    }
  }
}
0
додано

Ось ще одне рішення

<?php

//Configruations
$endpoints = array(
    '/'     => array( 'homepage', '404 Not found' ),
    'cats'  => array( 'Hobbes', 'Simba', 'Grumpy Cat' ),
    'dogs'  => array( 'Hobbes Dog', 'Simba Dog', 'Grumpy Dog' ),
    'birds' => array( 'Hobbes Bird', 'Simba Bird', 'Grumpy Bird' ),
);

//Parsing Request :: Take the last element from endpoint /abc/def/xyz
$endpoint = isset( $_SERVER['REQUEST_URI'] ) ? strtolower( $_SERVER['REQUEST_URI'] ) : "/";
$endpoint = parse_url( $endpoint, PHP_URL_PATH );
$endpoint = array_filter(explode("/", $endpoint));
$endpoint = array_pop($endpoint);
$endpoint = array_key_exists($endpoint, $endpoints) ? $endpoint : "/";

//Print Response
header('Content-Type: application/json');
echo json_encode($endpoints[$endpoint], JSON_PRETTY_PRINT);
0
додано
ІТ КПІ - JavaScript
ІТ КПІ - JavaScript
504 учасників

співтовариство javascript розробників в Telegram