Skip to content
Advertisement

WordPress hide post from custom post-type on a single page

Initial situation

  • custom post-type (projects)[projects.php]
<?php

namespace main_themeextposttypesprojects;


function post_type() {

    $labels = [
        'name'                  => _x( 'Projects', 'Post Type General Name', 'main_theme' ),
        'singular_name'         => _x( 'Project', 'Post Type Singular Name', 'main_theme' ),
        'menu_name'             => __( 'Projects', 'main_theme' ),
        'name_admin_bar'        => __( 'Projects', 'main_theme' ),
        'all_items'             => __( 'Alle Projects', 'main_theme' ),
        'add_new_item'          => __( 'Project hinzufügen', 'main_theme' ),
        'add_new'               => __( 'Hinzufügen', 'main_theme' ),
        'new_item'              => __( 'Neues Project', 'main_theme' ),
        'edit_item'             => __( 'Editiere Project', 'main_theme' ),
        'update_item'           => __( 'Project updaten', 'main_theme' ),
        'search_items'          => __( 'Suche Project', 'main_theme' ),
        'not_found'             => __( 'Kein Project gefunden', 'main_theme' ),
        'not_found_in_trash'    => __( 'Kein Project im Papierkorb gefunden', 'main_theme' ),
    ];

    $args = [
        'label'                 => __( 'Project', 'main_theme' ),
        'description'           => __( 'Hier kannst du Projekte anlegen.', 'main_theme' ),
        'labels'                => $labels,
        'hierarchical'          => false,
        'public'                => true,
        'show_ui'               => true,
        'show_in_menu'          => true,
        'menu_position'         => 5, // "posts" is 5
        'menu_icon'             => 'dashicons-media-code',
        'show_in_admin_bar'     => true,
        'show_in_nav_menus'     => true,
        'can_export'            => true,
        'has_archive'           => false, // products should be available for browsing
        'exclude_from_search'   => false,
        'publicly_queryable'    => true,
        'supports'              => [ 'title', 'editor', 'thumbnail', 'revisions','excerpt'],
        'show_in_rest'          => true,
        'taxonomies'            => ['post_tag'],
        'rewrite'               => [
            'slug'                  => 'projekte',
            'with_front'            => false,
        ]
    ];

    register_post_type('projects', $args );
}

add_action( 'init', __NAMESPACE__ . '\post_type', 0 );


  • custom field (with cmb2)[projects.php]
<?php

namespace main_themeextcmb2projects;

/**
 * Define the metabox and field configurations.
 */
function cmb2_metaboxes() {

// Start with an underscore to hide fields from custom fields list
    $prefix = '_projects_';
    /**
     * Initiate the metabox
     */
    $cmb = new_cmb2_box( array(
        'id'            => 'projects',
        'title'         => __( 'Projects', 'ideate' ),
        'object_types'  => array( 'projects', ), // Post type
        'context'       => 'normal',
        'priority'      => 'high',
        'show_names'    => true, // Show field names on the left
        // 'cmb_styles' => false, // false to disable the CMB stylesheet
        // 'closed'     => true, // Keep the metabox closed by default
    ) );


    $cmb->add_field( array(
        'name' => __( 'Auf Startseite anzeigen', 'ideate' ),
        'id'   => $prefix . 'show',
        'type'    => 'select',
        'preview_size' => 'large', // Image size to use when previewing in the admin.
        'options'          => array(
            'yes'        =>__( 'Ja', 'cmb' ),
            'no'     =>__( 'Nein', 'cmb' ),
        )
    ) );

        $cmb->add_field( array(
        'name' => __( 'Logo', 'ideate' ),
        'id'   => $prefix . 'logo',
        'type'    => 'file',
        // Optional:
        'options' => array(
            'url' => false, // Hide the text input for the url
        ),
        'text'    => array(
            'add_upload_file_text' => 'Add File' // Change upload button text. Default: "Add or Upload File"
        ),
        // query_args are passed to wp.media's library query.
        'query_args' => array(
             'type' => array(
                'image/gif',
                'image/jpeg',
                'image/png',
             ),
        ),
        'preview_size' => 'large', // Image size to use when previewing in the admin.
    ) );



}

add_action( 'cmb2_admin_init', __NAMESPACE__ . '\cmb2_metaboxes' );

  • front-page.php
<?php get_header(); ?>

<main>
    <div class="m-stage">
        <div class="m-stage-content">
        <?php if ( have_posts() ) : ?>
            <?php while ( have_posts() ) : the_post(); ?>
                <?php echo get_the_content(); ?>
            <?php endwhile; ?>
        <?php endif; ?>
        </div>
    </div>
    <? $count = 2; ?>
    <div class="m-rowteaser m-rowteaser--default"><?
        $loop = new WP_Query( array(
                'post_type' => 'projects',
                'orderby'   => 'rand',
                'posts_per_page' => 1,)
        );

        if ( $loop->have_posts() ) :
            while ( $loop->have_posts() ) : $loop->the_post(); ?>

              <div class="m-rowteaser-item <?
                if ($count%2 == 0){?>m-rowteaser-item--odd<?}
                else
                {?>m-rowteaser-item--even<?}?>">
                    <div class="m-rowteaser-image">
                        <a href="<?=get_the_permalink()?>">
                            <?=get_the_post_thumbnail( get_the_ID(),'full', "", ["class" => "m-rowteaser-img"]  ); ?>
                        </a>
                    </div>
                    <div class="m-rowteaser-content">
                        <div>
                            <img src="<?=get_post_meta( get_the_ID(), '_projects_logo', true );?>" alt="<?=get_post_meta( get_the_ID(), '_projects_logo_alt', true );?>" class="m-rowteaser-logo">
                            <h2 class="m-rowteaser-title">
                                <a href="<?=get_the_permalink()?>">
                                    <?php the_title(); ?>
                                </a>
                            </h2>
                            <?= wpautop( get_the_excerpt( get_the_ID(), '_projects_rte', true ) ); ?>

                            <a class="c-link" href="/projekte"><?=__( 'Alle Projekte', 'ideate' )?></a>
                        </div>
                    </div>
                </div>

                <? $count++; ?>

            <?php endwhile; ?>
        <?php endif; ?>
    </div>
  
    <?php get_template_part( 'partials/newsletter'); ?>
</main>

<?php get_footer(); ?>



What I want

On my front-page is a section ( <div class="m-rowteaser m-rowteaser--default"> ) what is displaying a random post from the post-type projects.

There are some post that I don’t want to see at the front-page.

Note: the post must be active because there is another page with these post.

In my backend I have a custom field where I want to select if it is displayed at the front page.

The way you can help me

  • give me an idea how a solution could be
  • give me an documentation about it
  • give me a code snippet
  • if you need something from me to help me leave a comment there.
  • please don’t hate me if I have some problems… I work for a short time now with code….

Thank you for helping me!!!! :))))

Update

Now I have a function that can hide post from the front-page by the id. I need help to connect this code with the custom field in the backend.

<?php



function wpb_exclude_from_home($query) {
      if ($query->is_home() ) {
          $query->set('post__not_in', array(134, 122,));
      }
}
add_action('pre_get_posts', 'wpb_exclude_from_home');

Advertisement

Answer

You can use the meta_query field to only show projects where _projects_show is set to yes (assuming that’s the field you want to use, feel free to adjust the code below where needed):

$loop = new WP_Query( array(
    'post_type' => 'projects',
    'orderby' => 'rand',
    'posts_per_page' => 1,
    'meta_query' => array(
        array(
            'key' => '_projects_show',
            'value' => 'yes',
            'compare' => '==',
        ),
    ),
));
User contributions licensed under: CC BY-SA
6 People found this is helpful
Advertisement