web-dev-qa-db-de.com

So ordnen Sie Posts im Admin-Bereich, die für die WP-API bestehen bleiben, schnell neu an

Im Allgemeinen verwende ich das intuitive Plugin für die benutzerdefinierte Post-Bestellung für alle WordPress-Sites, mit denen ich arbeite, damit Kunden ihre Posts visuell bestellen können.

Für dieses Projekt verwende ich WordPress als Admin-Panel und verwende seine Daten mit einem Ember.js-Frontend.

(mit wp-api V.2) Die neu geordnete Reihenfolge wird im JSON nicht angezeigt, und ich vermute, das Plugin speichert die neue Reihenfolge in einem dazwischenliegenden PHP-Teil.

Mit welchen Optionen kann mein Kunde nicht nur das Datum der einzelnen Posts manuell ändern, sondern auch die Posts auf intuitive Weise neu anordnen, sodass sie weiterhin angezeigt werden?

1
sheriffderek

Angenommen, die benutzerdefinierte Bestellung wird in der Spalte menu_order in der Tabelle wp_posts gespeichert.

Wenn Sie den hierarchischen Typ page post meinen (unterstützt Seitenattribute ), dann können Sie mit den Abfragevariablen bestellen:

/wp-json/wp/v2/pages/?orderby=menu_order&order=asc

Wenn du die post bezeichnest, schreibe mit:

/wp-json/wp/v2/posts/

es gibt eine Möglichkeit, den rest_{post_type}_query-Filter zu verwenden:

/**
 * Set orderby to 'menu_order' for the 'post' post type
 */
add_filter( "rest_post_query", function( $args, $request )
{
    $args['orderby'] = 'menu_order';
    return $args;
}, 10, 2 );

Wir möchten dies möglicherweise weiter einschränken. Beim Durchblättern der Klasse WP_REST_Request sehen wir, dass es eine praktische öffentliche Methode get_param() gibt, die wir verwenden können:

/**
 * Support for 'wpse_custom_order=menu_order' for the 'post' post type
 */
add_filter( "rest_post_query", function( $args, $request )
{
    if( 'menu_order' === $request->get_param( 'wpse_custom_order' ) )
        $args['orderby'] = 'menu_order';

    return $args;
}, 10, 2 );

wo wir es durch einen benutzerdefinierten wpse_custom_order Parameter aktivieren:

/wp-json/wp/v2/posts/?wpse_custom_order=menu_order&order=asc

Es gibt auch den dynamisch generierten rest_query_var-orderby Filter.

2
birgire

Wenn Sie Beiträge mit menu_order als orderby-Parameter bestellen, wird ein ungültiger Parameterfehler ausgegeben, z.

http://example.com/wp-json/wp/v2/posts?orderby=menu_order&order=asc

Invalid parameter(s): orderby (orderby is not one of date, id, include, title, slug)

Derzeit gibt es keinen Filter zum Hinzufügen einer weiteren orderby-Option rest-posts-controller.php # L1666

sie sollten sich zum Beispiel an posts_clauses einhängen

/**
 * Class Custom_Rest
 * @author 
 */
class Custom_Rest
{
    /**
     * init 
     * Add Rest Hooks
     *
     * @return void
     * @author 
     */
    public static function init()
    {
        add_filter( 'posts_clauses' , 'Custom_Rest::orderby' );
    }


    /**
     * orderby
     * Order posts by menu_order
     *
     * @return void
     * @author 
     */
    public static function orderby($v) {

        if ( $GLOBALS['wp']->query_vars['rest_route'] == '/wp/v2/posts' ) {
            // old value is  "wp_posts.post_date DESC"
            $v['orderby'] = str_replace('post_date', 'menu_order', $v['orderby']);
            return $v;
        }

    }

}


add_action( 'rest_api_init', 'Custom_Rest::init' );
0
Ahed Eid