web-dev-qa-db-fra.com

Obtenir la liste globale de tous les champs personnalisés pour le blog entier

Ainsi, comme le titre l'indique, j'aimerais qu'une seule fonction obtienne une liste agrégée de tous les champs personnalisés, à l'échelle du site (tous les posts, pages, CPT). Normalement, je fais cela avec quelques instructions SQL et jongle avec les résultats, mais je me demandais si quelqu'un avait mis au point un moyen de le faire plus orienté. Mais surtout, je voulais quelque chose de disponible en ligne et facile à trouver pour quelqu'un d'autre à la recherche de cela.

Voici le code SQL que j'utilise normalement:

SELECT DISTINCT `meta_key` FROM `prefix_postmeta` WHERE `meta_key` NOT LIKE "\_%"

Voici une fonction pour extraire une seule page ou les champs personnalisés de la publication:

$custom_fields = get_post_custom($post->ID);

foreach ( $custom_fields as $field_key => $field_values ) {
    if ( ! isset( $field_values[0] ) ) continue;
    if ( in_array( $field_key, array( "_edit_lock", "_edit_last" ) ) ) continue;
    echo $field_key . '=>' . $field_values[0];
}

Donc, fondamentalement, j'aimerais une fonction unique dans laquelle je peux coller functions.php et appeler lorsque j'ai besoin d'une liste de copier/coller à jour de tous mes champs personnalisés pour un plugin qui vous permet de les lister tous main - Vérificateur de lien brisé, par exemple.

1
SickHippie

La fonction ci-dessous stockera une liste distincte de tous les champs personnalisés pour la liste des publications/pages/publications personnalisées qui lui est transmise dans les clés du tableau $customfields. Les valeurs du tableau correspondent au nombre de publications avec le champ correspondant. Dans l'exemple, les champs personnalisés ajoutés par les plugins sont exclus ($value[0] != '_';) mais ils pourraient facilement être rajoutés.

function all_custom_fields($allposts) {
    foreach ( $allposts as $post ) : setup_postdata($post);
        $post_id = $post->ID;
        $fields = get_post_custom_keys($post_id);    // all keys for post as values of array
        if ($fields) {
            foreach ($fields as $key => $value) {
                if ($value[0] != '_') {              // exclude where added by plugin
                    $customfields[$value] = isset($customfields[$value]) ? $customfields[$value] + 1 : 1;
                }
            }
        }
    endforeach; wp_reset_postdata();
    return $customfields;
}

// example - all post types, whether published or not
$args = array(
    'post_status' => array('publish','draft','pending','future'),
    'post_type' => 'any',
    'posts_per_page' => -1,
);
$allposts = get_posts($args);
$customfields = all_custom_fields($allposts);
2
Jon