web-dev-qa-db-fra.com

Interroger le type d'article personnalisé par champ personnalisé

Informations générales

J'ai utilisé le plugin WP Types (wp-types.com) pour créer un type de message personnalisé appelé " artiste ".
Dans WP Types, vous pouvez également définir un autre type de publication en tant que type de publication parent. Ce n'est pas possible par défaut. ils ont implémenté cette fonctionnalité par une méta-requête avec la clé:
"_ wpcf_belongs_% POSTTYPE% _id" (dans mon cas " _wpcf_belongs_artist_id ")
et la valeur est l'ID de la publication parente.

Le problème

Normalement, si vous définissez une page X comme enfant de la page Y, vous disposerez de la structure de lien permanent suivante:
/page-y/page-x /

Je pensais que ce plugin adopterait ceci mais ce n'est pas le cas. Par exemple, j'utilise " painting " avec l'ID 24 comme page parente et " picasso " avec l'ID 72 comme enfant poste avec le type de message "artiste". Donc ça:
/painting/picasso /
me redirige vers:
/artiste/picasso /
mais affiche le bon contenu.

Ma solution approche

Comme le soutien payé ne pouvait pas m'aider, je dois essayer moi-même. Pour écrire mes propres règles de réécriture "personnalisées", je dois d'abord connaître la requête correcte. J'ai essayé de récupérer mon contenu manuellement:

index.php? _wpcf_belongs_artist_id = 24 & artist = picasso
me redirige vers:
/artist/picasso? _wpcf_belongs_artist_id = 24 & artist = picasso
avec la sortie correcte du poste d’artiste unique.

Ce:
index.php? _wpcf_belongs_artist_id = 24
vient de sortir ma page d'accueil.

La seule variante plus ou moins active est:
/painting/picasso /? artist = picasso & _wpcf_belongs_artist_id = 24 et:
/painting/picasso /? artist = picasso
Ces non me redirigent vers/artiste/picasso /… ou ailleurs, mais affichent le post correspondant à un artiste.

Ici vous pouvez trouver d'autres variantes et le fil entier dans les forums d'assistance de WP Types.

La première étape consisterait probablement à obtenir le bon contenu avec une variable de type requête telle que "parent_id". Après que je puisse commencer à gérer les règles de réécriture proprement dites, des problèmes pourraient survenir en raison de la double utilisation du niveau supérieur (% pagename% et% parent_id%). Cela va probablement confondre WordPress.

MISE À JOUR 12/17

J'ai essayé ce code pour obtenir toutes les publications avec le champ méta '_wpcf_belongs_artist_id' et la méta valeur extraite de l'URL (/? Parent_id = 24). Malheureusement, cela ne semble pas fonctionner. Il bloque les requêtes auxiliaires de mon sous-menu et affiche uniquement le résultat de la requête normale.

add_filter('query_vars', 'custom_query_vars');
function custom_query_vars($vars) {
    $vars[] = 'parent_id';
    return $vars;
}

function parent_query( $query ) {
    // Exclude
    if( $query->is_admin == 1 && !$query->is_main_query() && !$query->is_archive == 1 ) {
        return;
    }
    // retrieve field name / value from URL if exist
    $custom_field = '_wpcf_belongs_artist_id';
    $custom_value = ( $_GET['parent_id'] ) ? stripslashes( $_GET['parent_id'] ) : '';
    if( $custom_field ) {
        // add meta key requirement -- we’ll return all posts with some ‘color’
        $query->set( 'meta_key', '_wpcf_belongs_artist_id' );
        if( $custom_value ) {
            // build meta value requirement -- we’ll return only blue
            $query->set( 'meta_value', $custom_value );
        }
    }
}
add_action( 'pre_get_posts', 'parent_query' );
5
luke

Vous l'avez assez proche. Voici un exemple concret de ce que vous essayez de faire:

class Wpse_126374 {

    public function __construct() {
        add_action( 'init', array( $this, 'rewrites' ) );
        add_action( 'pre_get_posts', array( $this, 'pre_get_posts' ) );
    }

    public function rewrites() {
        add_rewrite_tag( '%parent_id%', '(\d+)' );
    }

    public function pre_get_posts( $query ) {
        // Don't run this on admin pages or secondary queries
        if ( is_admin() || ! $query->is_main_query() || $query->is_archive() )
            return;

        if ( '' != ( $parent_id = get_query_var( 'parent_id' ) ) ) {
            $query->set( 'meta_key', '_wpcf_belongs_artist_id' );
            $query->set( 'meta_value', $parent_id );
        }
    }

}
$wpse_126374 = new Wpse_126374;

Cela devrait vous permettre d'avoir parent_id=24 dans l'URL.

2
Matthew Boynes

Je pense que le problème est mal posé. Que se passe-t-il dès que vous ajoutez deux tableaux de Picasso? Vous voulez que les deux groupes/painting1/picasso et/painting2/picasso pointent vers le même 'post artiste unique'? Je suppose que c'est possible, mais je suis sûr que c'est compliqué inutilement (et peut causer des problèmes de référencement).

D'autre part, comme les artistes et les peintures sont des entités différentes, je trouve parfaitement acceptable que Picasso soit affiché sous/artist/picasso et que ce message soit lié à toutes les peintures dont il est l'auteur.

Utiliser la relation parentale est faux. Une peinture a (généralement) un seul auteur, mais un artiste peut produire plusieurs peintures. Mais un poste ne peut avoir qu'un seul parent. Par conséquent, un post d'artiste ne doit pas devenir l'enfant de l'une de ses peintures. Sinon, vous avez des problèmes dès que vous ajoutez une autre peinture du même auteur.

Au lieu de cela, vous devriez avoir l'artiste être une propriété de peintures. Pour ce faire, vous pouvez ajouter un champ personnalisé pour les peintures et éventuellement utiliser les relations de publication des types ou un autre périphérique pour faire en sorte que la valeur de ce champ personnalisé fasse référence à un type de publication d'artiste.

Avec cette approche, vos problèmes ne sont pas "résolus", ils disparaissent tout simplement.

0
adelval

Vous n'avez rien à retourner de votre fonction lorsque vous utilisez pre_get_posts:

function 
if( $query->is_admin() || !$query->is_main_query() || $query->is_archive() ) {
//Do your stuff
0
Manolo